XML文件中的自闭标签

时间:2011-08-29 15:00:20

标签: html xml tags

<tag id="foo" />

我注意到他们使用PHP SimpleXML。

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

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

为什么我应该使用旧方法?

6 个答案:

答案 0 :(得分:25)

请参阅XML和XHTML的W3C规范:

这取决于元素类型声明

  

没有内容的元素被认为是空的。空元素的表示形式是一个开始标记,紧跟一个结束标记,或一个空元素标记。

但也

  

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

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

的内容时
<!ELEMENT img EMPTY>

应该使用

<img/>

除非你有充分的理由使用

<img></img>

请注意SHOULD is defined in RFC2119

  

这个词,或形容词“推荐”,意思是那里      在特定情况下可能存在有效理由忽略a      特殊项目,但必须理解全部含义      在选择不同的课程之前仔细权衡。

如果您正在使用没有DTD或Schema的XML,您还可以使用predefined libxml constant来影响XML的序列化方式:

  

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

但请注意,此选项目前仅在函数DOMDocument::saveDOMDocument::saveXML中可用,因此您无法将其与SimpleXml一起使用。

答案 1 :(得分:2)

如果您想使用PHP的xml parser,可以specify actions开始标记,关闭标记或完整标记。根据您的意愿,您可能希望专门针对关闭标记采取行动。

答案 2 :(得分:1)

在某些情况下,单独的打开/关闭标签是必要的:作为一个例子,我发现&lt; script&gt; HTML中的标记需要单独打开/关闭才能在某些浏览器中保持一致。单独的打开/关闭有点冗长,但在这些情况下值得。

答案 3 :(得分:1)

它们与XML相同,但根据您的使用情况可能会有所不同。例如,在xhtml1.0中,允许自动关闭的标签有official list。只要您将doctype保持为正确的xhtml版本,就应该没问题。查看stackoverflow的this question以获得更详细的解释。

答案 4 :(得分:0)

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

XSD差异:

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

因此,将<element></element>用于整数是违法的,而<element/>则适用于所有简单类型。

JAXB差异:

JAXB(Java XML Binding)有类似的怪癖。它会将<element/>映射为不同的值,具体取决于目标数据类型

  • 对于String,它将是&#34;&#34;
  • 对于整数,它将为0。
  • 对于其他类型,它会跳过它。

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

HTML:

在HTML中,<element>第三个选项始终没有结束标记。我不了解你,但一天几次,我必须提醒自己,HTML不仅仅是XML。这实际上意味着<br><br/>不是同一件事。您不应该在HTML中使用<br/>,并且您不应该在XHTML中使用<br>

Angular 2 +:

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

如果没有太多详细的潜水,Angular会将自定义HTML标记替换为链接到组件的HTML模板。但是它只支持<element></element>格式。您不得使用<element/>格式。

我个人试图避免<element/>语法,因为它有可能使问题出错。 (= bad aji)。

答案 5 :(得分:-2)

这取决于您的环境和数据。在 SOME 系统中,空字符串和空字符串之间存在差异。也就是说,一个字符串类型是&#34; Nothing&#34;与实际存在但包含零个字符的字符串非常不同。

它们可以用XML表示:

  

null = "<mystring />"

     

empty = "<mystring></mystring>"

10次中有9次,它没有什么区别,但有时候没有数据和空数据之间的差异实际上非常显着(&#34;我不知道但是&#34; vs.&#34;我发现了,它是空的。&#34;)