什么是表示空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,那么在填充时有几个选项:
- 完全删除元素 – 当您希望指出系列不适用于本书或者本书不是系列的一部分时,可以完成此操作。 在这种情况下,xsl变换(或其他基于事件的处理器)的模板与book:series不会被调用。 例如,如果您的xsl将book元素转换为表格行(xhtml:tr),则可能会使用此方法获取不正确的表格单元格数(xhtml:td)。
- 将元素留空 – 这可能表示该系列是“”,或者是未知的,或者该书不是系列的一部分。 与book:series匹配的任何xsl转换(或其他基于parsing器的)都将被调用。 current()的值将是“”。 您将使用此方法得到相同数量的xhtml:td标签,如下所述。
- 使用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”用于表示没有值可用 - 可以使用
nilReason
logging缺失值的附加信息; 这可能是标准的GML原因之一(missing, inapplicable, withheld, unknown
),或者other:
文本所前缀的文本,或者可能是一个URI链接到更详细的解释。
在交换数据时,通常使用XML的angular色,发送给一个接收者的数据或给定目的的数据可能会隐藏内容,而这些内容对于付费或具有不同身份validation的其他人可用。 了解内容丢失的原因可能非常重要。
科学家也关心为什么缺less信息。 例如,如果由于质量原因而被丢弃,他们可能希望看到原始的不良数据。
在许多情况下,Null值的目的是为了提供以前版本的应用程序中没有的数据值。
所以说你有一个来自你的应用程序“ReportMaster”版本1的XML文件。
现在在ReportMaster版本2中添加了一些可能或不可定义的属性。
如果您使用'no tag means null'表示,您将获得自动向后兼容性来读取ReportMaster 1 xml文件。