【问题标题】:Why use an empty element in XML?为什么在 XML 中使用空元素?
【发布时间】:2015-03-16 16:35:54
【问题描述】:

在这里排名业余。我得到了关于如何在 XML 中使用空元素的说明。但你为什么要?除了(我猜)在解析 XML 时添加空白记录之外,它还有什么用途?

以下是来自 W3Schools 的信息:

"Empty XML Elements 一个没有内容的元素被称为是空的。在 XML,您可以像这样指示一个空元素:<element></element> 或者你可以使用一个空标签,像这样(这种元素语法是 叫自闭):<element />以上两种形式产生 在 XML 解析器中得到相同的结果。”

【问题讨论】:

  • 什么是HOW?提供更多信息
  • 直接来自 W3schools XML 页面:“空 XML 元素没有内容的元素被称为空元素。在 XML 中,您可以像这样指示空元素: 或你可以使用一个空标签,像这样(这种元素语法称为自关闭): 以上两种形式在 XML 解析器中产生相同的结果。”这很清楚。但我为什么要这样做呢?

标签: xml


【解决方案1】:

如果架构要求标签以特定顺序出现,您可能需要包含该标签,即使它有一个空值。例如,架构中的以下片段表明您需要在标签栏之前使用标签 foo:

<xs:element name="parent">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="foo" minOccurs="1" maxOccurs="1" />
      <xs:element name="bar" minOccurs="1" maxOccurs="1" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

所以下面的片段是有效的:

<parent>
  <foo />
  <bar>asdf!</bar>
</parent>

但以下不会:

<parent>
  <bar>asdf!</bar>
</parent>

此外,您可以使用空标签来表示空值(与空值相反)。然而,如果你试图在 XML 中表示一个空值,你真的应该使用xsi:nil 属性

【讨论】:

    【解决方案2】:

    根据我的经验,我在使用 API 时遇到过很多这样的格式。有时,API 创建者的变量为空,从而导致这些空 XML 标记。例如,假设您正在创建一个网站来收集不同酒店的空房情况。 A 公司(一些酒店公司)为您提供访问其 API 的权限。您发送请求,他们会为您提供以下信息:

    <response>
      <date>2008-01-10</date>
      <available>TRUE</available>
    </response>
    

    但有时你可能会得到:

    <response>
      <date>2008-01-10</date>
      <available>FALSE</available>
    </response>
    

    或者有时你可能会得到:

    <response>
      <date>2008-01-10</date>
      <available></available>
    </response>
    

    作为开发人员,您必须创建可用于任何类型响应的代码,因为我们不知道 API 创建者究竟是如何发回数据的,这就是教程中提到这一点的原因。希望这会有所帮助。

    【讨论】:

    • 这对非常有帮助。这就是我所说的“在解析 XML 时添加空白记录”时的意思。
    【解决方案3】:

    我认为您使用“空”元素来表示“没有任何类型的子元素的元素”。自闭合元素——那些没有单独的结束标签的元素——可能仍然有属性并且在这个意义上不是空的。

    (X)HTML 本身定义了“空”元素,例如&lt;br/&gt;。同样,即使&lt;br/&gt; 也可能具有class 和其他属性。

    对于如何在您自己的架构中使用它们的问题,您可以使用空 XML 元素作为“标记”(借用 .NET 使用术语“标记接口”表示没有成员的接口的方式)。当您想向元素添加“布尔”属性时,这很有用(例如 HTML 允许无值属性,例如 checked)。在这种情况下,使用属性会迫使您添加某种噪音(以无意义或空值的形式)。

    我用这种方式,例如,在莎士比亚戏剧中将演讲标记为散文:

    <speech>
        <speaker role="Archidamus">Archidamus</speaker>
        <prose/>
        <line a="If_you">If you shall chance, Camillo, to visit Bohemia, on</line>
        <line a="the_like">the like occasion whereon my services are now on</line>
        <line a="foot_you">foot, you shall see, as I have said, great</line>
        <line a="difference_betwixt">difference betwixt our Bohemia and your Sicilia.</line>
    </speech>
    

    也就是说,要解决可被视为 XML 的缺陷,,即无法表示非文本原语,这有点像一个杂项。

    【讨论】:

    • 只是从 HTML 世界中添加一个示例:使用类似 Text&lt;br/&gt;Some more text 的东西非常很常见。
    • 那么,在这个具体的例子中,您可以搜索所有包含散文的演讲?
    • @dirkk,是的,我们在想同样的事情 :)
    • @SteveT.,是的,它可以轻松(使用例如 XPath)测试元素的存在,但它不会干扰元素内容。
    • @harpo,“是的,它可以轻松(使用例如 XPath)测试元素的存在,但它不会干扰元素内容。”谢谢你。现在这是有道理的。 dirkk,也谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 2010-12-23
    • 2022-06-13
    • 1970-01-01
    相关资源
    最近更新 更多