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

时间:2009-04-21 19:24:56

标签: xml null xml-nil

我看到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是人为设计的,因此请不要过多地阅读。 :)

7 个答案:

答案 0 :(得分:108)

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

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

来自:The W3C

  

XML Schema:结构引入了一个   发信号通知的机制   元素应该被接受为·有效·   什么时候它没有内容   内容类型不需要或   甚至必然允许空内容。   元素可以是有效的,没有   内容,如果它有属性   xsi:nil,值为true。一个   如此标记的元素必须为空,但是   如果允许,可以携带属性   相应的复杂类型。

澄清:
如果你有一本书的xml元素,其中一个子元素是book:series,那么在填写它时你会有几个选项:

  1. 完全删除元素 - 当您希望表明该系列不适用于本书或该书不属于系列时,可以执行此操作。在这种情况下,xsl转换(或其他基于事件的处理器)具有与book:series匹配的模板永远不会被调用。例如,如果您的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”允许元素没有数据。另一个例子是十进制类型的元素。如果你想让它们为空,你可以联合一个只允许“”和小数的枚举字符串,或者使用一个可以为空的小数。

答案 1 :(得分:9)

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

答案 2 :(得分:8)

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

[Source]

答案 3 :(得分:6)

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。 如此标记的元素必须是   空,但如果相应允许则可以携带属性   复杂的类型。

澄清这个答案:                                                                内容                                  

  <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 number could be confusing and misguiding since its not present-->
  </Book>
</Books>

答案 4 :(得分:4)

当模式语义指示元素具有默认值时,使用xsi:nil,如果元素不存在,则应使用默认值。我必须假设有一些聪明的人,前面的句子并不是一个明显可怕的想法,但这对我来说听起来像九种坏事。我曾经使用的每种XML格式都通过省略元素来表示空值。 (或者属性,祝你用xsi:nil标记一个属性。)

答案 5 :(得分:4)

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

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

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

当您交换数据时,通常使用XML的角色,发送给一个收件人或出于给定目的的数据可能会使隐藏的内容可供付费或具有不同身份验证的其他人使用。了解内容缺失的原因非常重要。

科学家们也关注为什么缺少信息。例如,如果因质量原因而被删除,他们可能希望查看原始的错误数据。

答案 6 :(得分:2)

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

所以说你的应用程序“ReportMaster”版本1中有一个xml文件。

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

如果使用'no tag means null'表示,则会自动向后兼容以读取ReportMaster 1 xml文件。