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