表示空 XML 元素的正确方法是什么?

我看到 null元素以几种方式表示:

该元素与 xsi:nil="true"一起存在:

 <book>
<title>Beowulf</title>
<author xsi:nil="true"/>
</book>

元素是存在的,但表示为一个空元素 (我认为这是错误的,因为‘ em pty’和 null在语义上是不同的) :

 <book>
<title>Beowulf</title>
<author/>
</book>


<!-- or: -->
<book>
<title>Beowulf</title>
<author></author>
</book>

返回的标记 中根本没有该元素:

 <book>
<title>Beowulf</title>
</book>

元素有一个 <null/>子元素 (来自下面的 TStamper) :

 <book>
<title>Beowulf</title>
<author><null/></author>
</book>

有没有正确或规范的方法来表示这样的 null值?除了上面的例子还有其他的方法吗?

上面示例的 XML 是人为设计的,因此不要深究它。 :)

239368 次浏览

这取决于如何验证 XML。如果使用 XMLSchema 验证,表示 null值的正确方法是使用 xsi:nil属性。

[ 来源]

Nil 是表示如下值的正确方法: 当发出 DOM Level 2调用 getElementValue ()时,将返回 NULL 值。 Nil 还用于指示没有内容的有效元素,即使该元素的内容类型通常不允许空元素。

如果使用空标记,getElementValue ()返回空字符串(“”) 如果省略标记,那么甚至不存在作者标记。这可能在语义上不同于将它设置为‘ nil’(Ex。将“系列”设置为零可能意味着该书不属于任何系列,而省略系列可能意味着系列不适用于当前元素。)

发信人: W3C

XML 架构: 结构引入了 发出信号的机制 元素应该被接受为 · 有效 · 当它没有内容,尽管 内容类型不需要或 甚至必须允许空内容。 一个元素可以是有效的 内容,如果它具有属性 值为 true 的 如此标记的元素必须为空,但 可以携带属性,如果允许的话 相应的复杂类型。

澄清一下:
如果您有一个 book xml 元素,并且其中一个子元素是 book: Series,那么在填写它时有几个选项:

  1. 完全删除元素——当您希望指出系列不适用于本书或该书不是系列的一部分时,可以这样做。在这种情况下,xsl 转换(或其他基于事件的处理器)的模板将永远不会被调用。例如,如果您的 xsl 将 book 元素转换为 table row (xhtml: tr) ,您可能会使用此方法获得不正确的表单元格数(xhtml: td)。
  2. 保留元素为空——这可能表示该系列是“”,或者是未知的,或者该书不是该系列的一部分。匹配 book: Series 的任何 xsl 转换(或其他基于事件的解析器)都将被调用。Current ()的值将为“”。您将使用这个方法获得与下一个描述的方法相同数量的 xhtml: td 标记。
  3. 使用 xsi: nil = “ true”-这表示 book: Series 元素为 NULL,而不仅仅是空。将调用具有模板匹配 book: Series 的 xsl 转换(或其他基于事件的解析器)。Current ()的值将为空(而不是空字符串)。这个方法与(2)的主要区别在于,book: Series 的模式类型不需要允许空字符串(“”)作为有效值。这对于系列元素没有实际意义,但是对于在模式中定义为枚举类型的语言元素,xsi: nil = “ true”允许元素没有数据。另一个例子是十进制类型的元素。如果您希望它们为空,您可以联合一个只允许“”和一个小数的枚举字符串,或者使用一个可为空的小数。

在许多情况下,Null 值的用途是为应用程序以前版本中不存在的数据值提供服务。

假设您有一个来自应用程序“ ReportMaster”版本1的 xml 文件。

现在在 ReportMaster 版本2中添加了一些更多的属性,这些属性可能会被定义,也可能不会被定义。

如果使用“ no tag means null”表示,则会自动获得读取 ReportMaster 1 xml 文件的向下兼容。

当模式语义指示某个元素具有默认值,并且如果该元素不存在,则应使用默认值时,可以使用 xsi:nil。我不得不假设,对于一些聪明人来说,上面这句话并不是一个不言而喻的糟糕主意,但对我来说,它听起来像是九种糟糕的主意。我使用过的每种 XML 格式都通过省略元素来表示空值。(或者属性,祝你用 xsi:nil标记属性好运。)

简单地省略属性或元素可以很好地处理非正式数据。

如果需要更复杂的信息,GML 模式会添加属性 nilReason,例如: 在 GeoSciML中:

  • 值为“ true”的 xsi:nil用于表示没有可用值
  • nilReason可用于记录缺失值的其他信息; 这可能是标准 GML 原因之一(missing, inapplicable, withheld, unknown) ,或者 other:预先处理的文本,或者可能是指向更详细解释的 URI 链接。

当您交换数据(XML 通常用于此角色)时,发送给一个收件人或用于给定目的的数据可能含糊不清,这些内容可能对付费或具有不同身份验证的其他人可用。知道内容丢失的原因非常重要。

科学家们也关注为什么信息会丢失。例如,如果出于质量原因删除了它,那么他们可能希望看到原始的错误数据。

没有规范的答案,因为 XML 根本没有 null 概念。 但是我假设您想要 Xml/Object 映射(因为对象图有空值) ; 所以您的答案是“无论您的工具使用什么”。如果您编写处理,那意味着您喜欢的任何东西。对于使用 XMLSchema 的工具,xsi:nil是可行的方法。对于大多数映射器来说,省略匹配的元素/属性是一种方法。

W3链接中的文档:

Http://www.w3.org/tr/rec-xml/#sec-starttags

这些是建议的表格:

<test></test>
<test/>

另一个答案中提到的属性是一种验证机制,而不是状态的表示。请参阅: http://www.w3.org/TR/xmlschema-1/#xsi_nil

XML 模式: 结构引入了一种 < strong > 机制,用于表示 元素如果没有内容,则应该接受为 · valid· 内容类型,不需要,甚至不一定允许空 如果一个元素具有 属性 xsi: nil,值为 true。 < strong > 这样标记的元素必须是 空 ,但是如果对应的 复杂型。

为了澄清这个答案:

<?xml version="1.0" encoding="utf-8" ?>
<Books>
<Book>
<!--This element should alway be empty-->
<BuildAttributes HardCover="true" Glued="true" xsi:nil="true"/>
<Index></Index>
<pages>
<page pageNumber="1">Content</page>
</pages>
<!--Valid representation of a null or empty ISBN-->
<ISBN></ISBN>
</Book>


<Book>
<!--Invalid construct since the element attribute xsi:nil="true" signal that the element must be empty-->
<BuildAttributes HardCover="true" Glued="true" xsi:nil="true">
<anotherAttribute name="Color">Blue</anotherAttribute>
</BuildAttributes>
<Index></Index>
<pages>
<page pageNumber="1">Content</page>
</pages>
<!--Missing ISBN could be confusing and misguiding since its not present-->
</Book>
</Books>