题
我见过 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/>
子元素 (从 压模机 以下):
<book>
<title>Beowulf</title>
<author><null/></author>
</book>
是否有正确的或规范的方式来表示这样的 null
价值?除了上述示例之外,还有其他方法吗?
上面示例的 XML 是人为设计的,因此不要对其进行过多解读。:)
解决方案
xsi:nil 是表示以下值的正确方法:当发出 DOM Level 2 调用 getElementValue() 时,将返回 NULL 值。xsi:nil 还用于指示没有内容的有效元素,即使该元素内容类型通常不允许空元素。
如果使用一个空标签,则getElementValue()将返回空字符串(“”)如果省略了标签,则甚至没有作者标签。这在语义上可能与将其设置为“nil”不同(例如将“Series”设置为 nil 可能意味着该书不属于任何系列,而省略系列可能意味着该系列对于当前元素不适用。)
从: 万维网联盟
XML 架构:结构引入了一种机制,以表明当元素没有内容类型的内容类型,甚至不需要允许空的内容时,应将其视为·有效·。如果元素具有属性xsi:nil具有true的属性,则可以是·有效·没有内容。如此标记的元素必须为空,但是如果相应的复杂类型允许,则可以携带属性。
澄清:
如果您有一个 book xml 元素,并且子元素之一是 book:series,则在填写时您有多种选择:
- 完全删除该元素 - 当您希望表明该系列不适用于本书或该书不是系列的一部分时,可以执行此操作。在这种情况下,具有与 book:series 匹配的模板的 xsl 转换(或其他基于事件的处理器)将永远不会被调用。例如,如果您的 xsl 将 book 元素转换为表格行 (xhtml:tr),则使用此方法可能会得到不正确的表格单元格数量 (xhtml:td)。
- 将元素留空 - 这可能表明该系列是“”,或者未知,或者该书不是系列的一部分。任何与 book:series 匹配的 xsl 转换(或其他基于 Evernt 的解析器)都将被调用。current() 的值将为“”。使用此方法您将获得与下一个描述的方法相同数量的 xhtml:td 标记。
- 使用 xsi:nil="true" - 这表示 book:series 元素为 NULL,而不仅仅是空。将调用具有模板匹配 book:series 的 xsl 转换(或其他基于事件的解析器)。current() 的值将为空(不是空字符串)。此方法与 (2) 之间的主要区别在于 book:series 的架构类型不需要允许空字符串 ("") 作为有效值。这对于系列元素没有任何实际意义,但对于在架构中定义为枚举类型的语言元素,xsi:nil="true" 允许元素没有数据。另一个例子是十进制类型的元素。如果您希望它们为空,您可以联合一个仅允许“”和小数的枚举字符串,或者使用可以为空的小数。
其他提示
没有规范的答案,因为 XML 根本上没有 null 概念。但我假设您需要 Xml/对象映射(因为对象图有空值);所以你的答案是“无论你的工具使用什么”。如果你写处理,那就意味着你喜欢什么。对于使用 XML 模式的工具, xsi:nil
是要走的路。对于大多数映射器来说,省略匹配元素/属性是实现这一点的方法。
这取决于你如何验证XML。如果使用XML模式验证,代表null
值的正确的方法是与xsi:nil
属性。
[源]
在W3链接的文档
http://www.w3.org/TR/REC-xml /#仲丁基starttags
说,这是recomended形式。
<test></test>
<test/>
在对方的回答中提到的属性是验证机制,而不是状态的表示。请参阅 http://www.w3.org/TR/xmlschema-1/ #xsi_nil
XML模式:结构引入的机制用于信令,一个 元件应该被接受为有效··强>当它具有尽管没有内容 不需要或甚至一定允许空的内容类型 内容。元件可以被有效··如果没有内容,如果有 属性XSI:零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>
您使用xsi:nil
当你的模式语义指示元素有一个默认值,如果元素不存在应使用默认值。我必须假设,有聪明的人谁上句是不是一个不言而喻的可怕的想法,但它听起来像是9种对我不好。我曾经合作过的每个XML格式代表省略元素空值。 (或属性,并且幸运标记与xsi:nil
一个属性。)
在不太正式的数据中,简单地省略属性或元素效果很好。
如果您需要更复杂的信息,GML 模式会添加属性 nilReason,例如:在 地球科学机器学习:
xsi:nil
值为“true”用于指示没有可用值nilReason
可用于记录缺失值的附加信息;这可能是标准 GML 原因之一(missing, inapplicable, withheld, unknown
),或前面加上的文本other:
, ,或者可能是指向更详细解释的 URI 链接。
当您交换数据时,XML 常用的角色、发送给一个接收者或出于给定目的的数据可能会隐藏一些内容,而这些内容对于付费或具有不同身份验证的其他人来说是可用的。了解内容丢失的原因非常重要。
科学家们还担心信息缺失的原因。例如,如果由于质量原因而被丢弃,他们可能想查看原始的不良数据。
在许多情况下,Null值的目的是为对于不存在于先前的版本的应用程序的一个数据值。
所以说,你从你的应用 “ReportMaster” 第1版有一个XML文件。
现在在ReportMaster 2版中的一些更多的属性已被添加了可能会或不会被限定。
如果您使用的“无标签意味着空”表示你自动向后兼容读取您的ReportMaster 1 XML文件。