我见过 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,则在填写时您有多种选择:

  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" 允许元素没有数据。另一个例子是十进制类型的元素。如果您希望它们为空,您可以联合一个仅允许“”和小数的枚举字符串,或者使用可以为空的小数。

其他提示

没有规范的答案,因为 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文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top