<tag id="foo" />
我注意到他们使用PHP SimpleXML。
但我在网上找到的所有XML示例都以旧的方式关闭它们:
<tag id="foo"></tag>
为什么我应该使用旧方法?
答案 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::save
和DOMDocument::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架构定义,那么<element></element>
实际上只能用于字符串类型。因为,它是什么,它实际上是一个空字符串值:""
。
因此,将<element></element>
用于整数是违法的,而<element/>
则适用于所有简单类型。
JAXB(Java XML Binding)有类似的怪癖。它会将<element/>
映射为不同的值,具体取决于目标数据类型:
您可能会认为<element/>
会解析为null
值。但实际上你需要使用<element xsi:nil="true"/>
。这是我在实践中从未见过的。
在HTML中,<element>
的第三个选项始终没有结束标记。我不了解你,但一天几次,我必须提醒自己,HTML不仅仅是XML。这实际上意味着<br>
和<br/>
不是同一件事。您不应该在HTML中使用<br/>
,并且您不应该在XHTML中使用<br>
。
但我真正想要的是,继续最后一个声明,如果你使用像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;)