XML文件中的自闭标签

Nat*_*sha 25 html xml tags

<tag id="foo" />

我注意到他们使用PHP SimpleXML.

但是我在网上找到的所有XML示例都以旧方式关闭它们:

<tag id="foo"></tag>

有什么理由我应该使用旧方法吗?

Gor*_*don 28

请参阅XML和XHTML的W3C规范:

它取决于元素类型声明

没有内容的元素被认为是空的.空元素的表示是紧跟在结束标记之后的开始标记,或者是空元素标记.

但是也

空元素标签可以用于任何没有内容的元素,无论是否使用关键字EMPTY声明它.对于互操作性,对于声明为EMPTY的元素,应该使用empty-element标记,并且只应该使用它.

这意味着,当您的DTD包含类似的内容时

<!ELEMENT img EMPTY>
Run Code Online (Sandbox Code Playgroud)

应该使用

<img/>
Run Code Online (Sandbox Code Playgroud)

除非你有充分的理由使用

<img></img>
Run Code Online (Sandbox Code Playgroud)

注意,SHOULD在RFC2119定义

这个词,或形容词"建议",意味着有可能存在在特定情况下正当的理由忽略特定的项目,但是完整的含义必须选择不同的做法之前,必须了解和仔细权衡.

如果您正在使用没有DTD或Schema的XML,那么您还可以使用预定义的libxml常量来影响XML的序列化方式:

LIBXML_NOEMPTYTAG(整数):展开的空标签(例如<br/><br></br>)

但是请注意,这个选项是目前只是在功能可用的DOMDocument::saveDOMDocument::saveXML,所以你不能用SimpleXML使用它.


bvd*_*vdb 8

是的,这并不像起初看起来那么简单。

XSD 差异:

首先,这取决于您的数据类型。如果您使用 XSD 架构定义,它定义了您的元素的类型,那么<element></element> 实际上只能用于字符串类型。因为,就是这样,它实际上是一个空字符串值:""

因此,<element></element>用于整数是非法的,而相反,<element/>它适用于所有简单类型。

JAXB 差异:

JAXB(Java XML 绑定)也有类似的怪癖。它会根据目标数据类型映射<element/>不同的值

  • 对于字符串,它将是一个“”
  • 对于整数,它将是 0。
  • 对于其他类型,它只会跳过它。

您可能会认为这<element/>将解析为一个null值。但你实际上需要使用<element xsi:nil="true"/>它。这是我在实践中从未见过的。

HTML:

在 HTML 中,总是有第三个选项<element>没有关闭标签。我不了解你,但每天有好几次,我必须提醒自己 HTML 不仅仅是 XML。这实际上意味着这<br><br/>不是一回事。您不应该<br/>在 HTML 中使用,也不应该<br>在 XHTML 中使用。

角度 2+:

但我真正想说的是,继续上一个声明,如果您使用像 Angular2+ 这样的框架,还有另一件事要记住。

Angular 没有过多深入地介绍,而是用链接到组件的 HTML 模板替换了自定义 HTML 标签。但是它只支持<element></element>格式。您不得使用该<element/>格式。

我个人尽量避免使用这种<element/>语法,因为它有可能让事情出错。(=坏阿吉)。


Fem*_*emi 1

在某些情况下,单独的打开/关闭标记是必要的:例如,我发现 HTML 中的 <script> 标记需要具有单独的打开/关闭才能在某些浏览器中一致地工作。单独的打开/关闭有点冗长,但在这些情况下是值得的。

  • 严格来说,XHT​​ML 是 HTML 和 XML 的扩展。但是,建议仅在不包含内容的元素上使用自闭合标签。例如,不要使用 `&lt;p /&gt;`,即使它可以在主要浏览器中运行 (http://www.w3.org/TR/xhtml1/#C_3)。**然而,HTML 并不是 XML 的方言,它是 SGML 的扩展。** 创建 HTML 时,XML 甚至不作为规范存在。 (5认同)
  • 但这是 HTML,与 XML 不同。 (3认同)