在不违反标准的情况下使用单个标签?

Using an individual tag without breaking the standards?

提问人:Daniel Marschall 提问时间:7/7/2018 更新时间:7/7/2018 访问量:43

问:

我想创建某种 API,人们可以在其中将隐藏信息包含在网站中,以便机器人可以读取信息。

我知道元标签是可能的,但我正在考虑使用某种单独的标签,因为这样我就可以使用 DOM,它使用起来更舒服一些,而且更容易被人类阅读。

例:

<html>
...
<body>
...
<mytag id="123" foo="bar" bar="foo"></mytag>
...
<mytag id="345" foo="bar" bar="foo"></mytag>
...
</body>
</html>

我的问题是,是否有可能以某种方式使这个单独的标签符合标准,也许可以通过创建某种 DTD ?

如果可能的话,我想支持 HTML 4.01、XHTML 和 HTML 5。

HTML xHTML W3C 验证

评论

1赞 Daniel Marschall 7/7/2018
我将研究这个问题,但是,我的问题朝着不同的方向发展,因为我正在寻找支持 HTML 4 和 XHTML 的可能性。因此,仅HTML5的解决方案不是我想要的。
0赞 Mr Lister 7/7/2018
有许多不同的答案,这取决于你问谁。从技术上讲,答案是否定的,标签名称打破了标准。mytag
0赞 Mr Lister 7/7/2018
您究竟想要实现什么,而这些目标无法通过具有特定类的 div、文件中 JavaScript 部分中的数据块或使用非 HTML xml 文件来实现?
0赞 Daniel Marschall 7/7/2018
谢谢你的想法。我希望人们可以输出一些视觉信息以及看不见的机器可读信息。因此,纯 XML 文件不是解决方案。Javascript 数据块有点棘手,因为我想用 PHP 读取机器可读部分,所以我需要一个 JS 解析器。带有数据属性的 span 或 div 可能是一种解决方案,尽管不是 100% HTML 4。(我可以在 HTML4 文档的头部添加某种 DTD 以让它知道数据标签是有效的吗?

答:

1赞 unor 7/7/2018 #1

必须支持 HTML 4.01 HTML5 使这变得困难。你不能使用名称元素(适用于 HTML 4.01,但它们必须为 HTML5 注册),你不能使用自定义 data-* 属性(在 HTML 4.01 中不允许),你不能使用微数据(仅为 HTML5+ 定义),你不能使用自定义元素为 HTML5+ 定义)。

我能想到两种方法。

script元素作为数据块

在 HTML5 中,该元素也可用于数据块。示例:text/html、text/plainscript

HTML 4.01 规范没有这样定义它,但它应该是可能的/有效的(它会将其理解为“脚本”,但如果用户代理无法识别脚本的内容类型,则不应尝试运行它)。

缺点:内容不是文档 DOM 的一部分。

RDFa型

HTML 4.01 和 HTML5 允许这样做(您可能需要为较旧的 HTML 版本调整 DOCTYPE,例如 XHTML)。

您不能使用自定义元素,但可以添加 and 属性(用于名称-值对),也可以用于“项目”(例如,使用元素名称的用途),并且可以在 .propertycontenttypeofmetalinkbody

<div vocab="https://api.example.com/voc#" class="the-hidden-information">

  <div typeof="Item-123">
    <meta property="foo1" content="bar1" />
    <meta property="foo2" content="bar2" />
  </div>

  <div typeof="Item-345">
    <meta property="foo1" content="bar1" />
    <link property="foo5" href="/some-url" />
  </div>

</div>

(当使用 RDFa 1.0 而不是 1.1 时,您必须使用 xmlns 而不是 vocab)

评论

1赞 Daniel Marschall 7/8/2018
非常感谢您的回答和两个建议!RDFa 听起来很有趣,但它看起来也有点复杂(通常需要一个框架来读取它们)。我想我会使用JSON数据块。这样,我可以轻松地在文件中读取和写入分层机器可读数据结构(我将使用 PHP 的 DOM 库找到元素,然后使用<script type="application/json">json_decode)