175

我已经看到null以多种方式表示的元素:

该元素存在于xsi:nil="true"

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

该元素存在,但表示为一个空元素(我认为这是错误的,因为“空”并且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 是人为设计的,所以不要读得太深。:)

4

7 回答 7

129

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

如果使用空标签,getElementValue() 将返回空字符串 ("") 如果省略标签,则甚至不存在作者标签。这在语义上可能与将其设置为“nil”不同(例如,将“Series”设置为 nil 可能意味着该书不属于任何系列,而省略系列可能意味着该系列对当前元素来说是不适用的元素。)

来自:W3C

XML Schema:Structures 引入了一种机制,用于发出信号,当一个元素没有内容时,它应该被接受为·有效·,尽管内容类型不需要甚至不一定允许空内容。如果一个元素的属性xsi:nil 的值为true,它可能是没有内容的有效的。如此标记的元素必须为空,但如果相应的复杂类型允许,则可以携带属性。

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

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

没有规范的答案,因为 XML 基本上没有空概念。但我假设你想要 Xml/Object 映射(因为对象图有空值);所以你的答案是“无论你的工具使用什么”。如果你写处理,那意味着你喜欢什么。对于使用 XML Schema 的工具,这xsi:nil是可行的方法。对于大多数映射器,省略匹配元素​​/属性是这样做的方法。

于 2009-04-23T03:54:41.047 回答
9

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

[来源]

于 2009-04-21T19:32:28.580 回答
8

w3链接中的文档:

http://www.w3.org/TR/REC-xml/#sec-starttags

说这些是推荐的形式:

<test></test>
<test/>

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

XML Schema:Structures 引入了一种机制,用于发出信号,当一个元素没有内容时,它应该被接受为·有效·,尽管内容类型不需要甚至不一定允许空内容。如果一个元素的属性xsi:nil 的值为true,它可能是没有内容的有效的。如此标记的元素必须为空,但如果相应的复杂类型允许,则可以携带属性。

为了澄清这个答案:

<?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>
于 2009-05-01T07:34:12.143 回答
4

当您xsi:nil的模式语义表明一个元素具有默认值并且如果该元素不存在时应该使用该默认值时,您可以使用该默认值。我不得不假设有一些聪明人认为前面这句话不是一个不言而喻的可怕想法,但对我来说这听起来像是九种坏事。我曾经使用过的每种 XML 格式都通过省略元素来表示空值。(或属性,祝你好运用 . 标记属性xsi:nil。)

于 2009-04-22T03:48:48.997 回答
4

简单地省略属性或元素在不太正式的数据中效果很好。

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

  • xsi:nil值为“true”用于指示没有可用的值
  • nilReason可用于记录缺失值的附加信息;这可能是标准 GML 原因之一(missing, inapplicable, withheld, unknown),或前面的文本other:,或者可能是指向更详细说明的 URI 链接。

当您交换数据时,通常使用 XML 的角色、发送给一个接收者或用于特定目的的数据可能具有模糊的内容,而这些内容对于支付或具有不同身份验证的其他人是可用的。了解内容丢失的原因可能非常重要。

科学家们还关心信息缺失的原因。例如,如果出于质量原因将其删除,他们可能希望查看原始的不良数据。

于 2009-04-23T03:44:58.700 回答
2

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

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

现在,在 ReportMaster 版本 2 中,添加了更多可能定义或未定义的属性。

如果您使用“无标签意味着空”表示,您将获得自动向后兼容来读取您的 ReportMaster 1 xml 文件。

于 2009-04-21T19:42:45.623 回答