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

我已经看到以几种方式表示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是人为的,所以不要读得太多。 🙂

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

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

来自: W3C

XML Schema:Structures引入了一种机制,用于指示元素在没有内容的情况下应该被接受为有效的,尽pipe内容types不需要甚至不一定允许空内容。 如果一个元素具有值为true的属性xsi:nil,则该元素可以是无效的。 如此标记的元素必须为空,但如果相应的复合types允许,则可以携带属性。

澄清:
如果您有一本书的xml元素,并且其中一个子元素是book:series,那么在填充时有几个选项:

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

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

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

[ 来源 ]

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

w3链接中的文档

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

说这是推荐的forms。

 <test></test> <test/> 

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

XML Schema:Structures引入了一种机制,用于指示元素在没有内容的情况下应该被接受为有效的 ,尽pipe内容types不需要甚至不一定允许空内容。 如果一个元素具有值为true的属性xsi:nil,则该元素可以是无效的。 如此标记的元素必须为空 ,但如果相应的复合types允许,则可以携带属性。

澄清这个答案:内容

  <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> 

在不太正式的数据中简单地省略属性或元素就行得通。

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

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

在交换数据时,通常使用XML的angular色,发送给一个接收者的数据或给定目的的数据可能会隐藏内容,而这些内容对于付费或具有不同身份validation的其他人可用。 了解内容丢失的原因可能非常重要。

科学家也关心为什么缺less信息。 例如,如果由于质量原因而被丢弃,他们可能希望看到原始的不良数据。

在许多情况下,Null值的目的是为了提供以前版本的应用程序中没有的数据值。

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

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

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