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

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

问题描述:

我看到若干方式表示null元素:什么是表示空XML元素的正确方法?

的元素存在与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是人为设计的,所以不要读得太多。 :)

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

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

来自:The W3C

XML模式:结构引入了 机构,用于发信号通知一个 元件应该被接受作为·有效· 当它具有尽管 内容类型没有内容,其不需要或 甚至必须允许空的内容。 如果一个元素的属性为 xsi:nil,其值为true,则该元素可能是有效的,不含 内容。如此标记的 元素必须为空,但如果允许使用 对应的复杂类型,则 可以携带属性。

一个澄清:
如果你有一本书的XML元素和子元素之一是书:系列产品在您填写的时候出来几个选项:

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

使用XSI:无是正确的,但你应该确保它是正确的命名空间内:XMLNS :xsi =“http://www.w3.org/2001/XMLSchema-instance” – STW 2009-05-01 01:42:50

+0

它实际上是`xmlns:xsi =“ht TP://w3.org/2001/XMLSchema-instance“`。请注意缺少的http://。这很重要,因为命名空间字符串实际上只是xml解析器的一个字符串,而不是uri。 – 2015-01-01 21:30:51

+9

呵呵,我相信还是有点不对。它应该是`xmlns:xsi =“http://www.w3.org/2001/XMLSchema-instance”`。请注意“www。”。见http://www.w3.org/TR/xmlschema-1/#no-xsi – 2015-02-16 12:30:53

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

[Source]

在许多情况下,Null值的用途是服务于以前版本的应用程序中没有的数据值。

所以说,你从你的应用“ReportMaster”第1版。

有一个XML文件,现在ReportMaster 2版本中一些属性被添加可能会或不会被定义。

如果您使用'no tag means null'表示,您将自动获得向后兼容性,以便读取ReportMaster 1 xml文件。

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

简单地忽略该属性或元素在较不正式的数据中工作良好。

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

  • xsi:nil与“真”的值被用来表示没有可用的值
  • 可以使用nilReason来记录缺失值的附加信息;这可能是标准的GML原因之一(missing, inapplicable, withheld, unknown)或other:前缀的文本,或者可能是更详细解释的URI链接。

当你交换数据,XML通常用于这方面的作用,发送给一个收件人或给定的目的可能有内容的数据掩盖了将提供给别人谁支付或有不同的认证。了解内容丢失的原因可能非常重要。科学家们也在关心为什么信息不见了。例如,如果由于质量原因而被删除,他们可能希望看到原始的不良数据。

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

在W3链接

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

文档说,这是recomended形式。

<test></test> 
<test/> 

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

XML模式:结构引入了机制,信令的 元素不应被当作·有效·当它具有尽管不需要,甚至不一定是 内容类型没有内容允许空 内容。如果元素的 属性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>