<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::save
和DOMDocument::saveXML
,所以你不能用SimpleXML使用它.
是的,这并不像起初看起来那么简单。
首先,这取决于您的数据类型。如果您使用 XSD 架构定义,它定义了您的元素的类型,那么<element></element>
实际上只能用于字符串类型。因为,就是这样,它实际上是一个空字符串值:""
。
因此,<element></element>
用于整数是非法的,而相反,<element/>
它适用于所有简单类型。
JAXB(Java XML 绑定)也有类似的怪癖。它会根据目标数据类型映射<element/>
为不同的值:
您可能会认为这<element/>
将解析为一个null
值。但你实际上需要使用<element xsi:nil="true"/>
它。这是我在实践中从未见过的。
在 HTML 中,总是有第三个选项<element>
没有关闭标签。我不了解你,但每天有好几次,我必须提醒自己 HTML 不仅仅是 XML。这实际上意味着这<br>
和<br/>
不是一回事。您不应该<br/>
在 HTML 中使用,也不应该<br>
在 XHTML 中使用。
但我真正想说的是,继续上一个声明,如果您使用像 Angular2+ 这样的框架,还有另一件事要记住。
Angular 没有过多深入地介绍,而是用链接到组件的 HTML 模板替换了自定义 HTML 标签。但是它只支持<element></element>
格式。您不得使用该<element/>
格式。
我个人尽量避免使用这种<element/>
语法,因为它有可能让事情出错。(=坏阿吉)。
在某些情况下,单独的打开/关闭标记是必要的:例如,我发现 HTML 中的 <script> 标记需要具有单独的打开/关闭才能在某些浏览器中一致地工作。单独的打开/关闭有点冗长,但在这些情况下是值得的。