【问题标题】:Self-closing tags in XML filesXML 文件中的自闭合标签
【发布时间】:2011-11-06 02:38:28
【问题描述】:

<tag id="foo" />

我注意到它们可以使用 PHP SimpleXML。

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

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

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

【问题讨论】:

  • 据我所知,它们是等价的。第一种方法不那么冗长,并且可以节省一些字符。有时您可能还会看到<tag id="foo" xsi:nil="true"/>
  • 我讨厌 nil="true"。就我而言,<tag /> 表示空白。并且完全省略该元素意味着 NULL。保留标签并将其标记为 NULL 只是臃肿。

标签: html xml tags


【解决方案1】:

查看 XML 和 XHTML 的 W3C 规范:

这取决于元素类型声明

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

还有

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

这意味着,当你的 DTD 包含类似的东西时

<!ELEMENT img EMPTY>

应该使用

<img/>

除非你有充分的理由使用

<img></img>

注意SHOULD is defined in RFC2119

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

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

LIBXML_NOEMPTYTAG(整数):展开空标签(例如,&lt;br/&gt;&lt;br&gt;&lt;/br&gt;

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

【讨论】:

    【解决方案2】:

    是的,它并不像一开始看起来那么简单。

    XSD 差异:

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

    因此,将&lt;element&gt;&lt;/element&gt; 用于整数是非法的,而&lt;element/&gt; 则适用于所有简单类型。

    JAXB 差异:

    JAXB(Java XML 绑定)也有类似的怪癖。它会将&lt;element/&gt; 映射为根据目标数据类型的不同值

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

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

    HTML:

    在 HTML 中总是有 &lt;element&gt; 的第三个选项,没有结束标记。我不了解你,但我必须每天多次提醒自己 HTML 不仅仅是 XML。这实际上意味着&lt;br&gt;&lt;br/&gt; 不是一回事。您不应该在 HTML 中使用 &lt;br/&gt;,也不应该在 XHTML 中使用 &lt;br&gt;

    Angular 2+:

    但我真正想表达的是,如果你使用像 Angular2+ 这样的框架,那么继续上一条语句,还有一件事要记住。

    在没有过多详细介绍的情况下,Angular 将自定义 HTML 标记替换为链接到组件的 HTML 模板。但是它只支持&lt;element&gt;&lt;/element&gt; 格式。不允许使用&lt;element/&gt; 格式。

    我个人尽量避免使用&lt;element/&gt; 语法,因为它有可能使事情出错。 (= bad aji)。

    【讨论】:

      【解决方案3】:

      当您想使用 PHP 的 xml parser 时,您可以在开始标签、结束标签或完整标签上使用 specify actions。根据您的意愿,您可能希望专门针对关闭标签执行操作。

      【讨论】:

        【解决方案4】:

        在某些情况下,单独的打开/关闭标签是必要的:例如,我发现 HTML 中的

        【讨论】:

        • 但那是 HTML,和 XML 不一样。
        • 严格来说,(X)HTML 是 XML 的一种方言。在某些情况下,浏览器解析可能会更轻松,以处理格式错误的文档,但是……它仍然是 XML。
        • 严格来说,XHT​​ML 是 HTML 和 XML 的扩展。但是,建议仅在从不包含内容的元素上使用自闭合标签。例如,不要使用&lt;p /&gt;,即使它在主要浏览器中工作(w3.org/TR/xhtml1/#C_3)。 然而,HTML 不是 XML 的一种方言,它是 SGML 的扩展。在创建 HTML 时,XML 甚至不作为规范存在。
        【解决方案5】:

        它们对于 XML 是相同的,但根据您的使用情况可能会有所不同。例如,在 xhtml1.0 中,有一个 official list 用于允许自动关闭的标签。只要您确实将您的文档类型保持为正确的 xhtml 格式,就可以了。查看 stackoverflow 的 this question 以获得更详细的说明。

        【讨论】:

          【解决方案6】:

          我知道线程很旧,但我做了一些简单的工作,至少在 C# 中。

          将您的 xml 文档传递给此例程;

            void FillInTheBlanks(XElement root){
                  foreach ( var xE in root.Elements().ToList<XElement>()){
                      if (xE.Elements().Count() == 0){
                          if (String.IsNullOrEmpty(xE.Value)){
                              xE.SetValue("UNIQUENONSENSE");
                          }
                      }
                      else {
                          FillInTheBlanks(xE);
                      }
                  }
              }
          

          填充空白(根);

          将文档转换为字符串

          var xml = root.ToString();

          然后用空字符串替换填充短语

          xml = xml.Replace("UNIQUENONSENSE", "");

          tada,结束标签;

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-09-30
            • 2017-11-10
            相关资源
            最近更新 更多