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

标签 xml null xml-nil

我看过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值(value)?除上述示异常(exception),还有其他方法吗?

上面示例的 XML 是人为设计的,所以不要读得太深。 :)

最佳答案

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

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

发件人:The W3C

XML Schema: Structures introduces a mechanism for signaling that an element should be accepted as ·valid· when it has no content despite a content type which does not require or even necessarily allow empty content. An element may be ·valid· without content if it has the attribute xsi:nil with the value true. An element so labeled must be empty, but can carry attributes if permitted by the corresponding complex type.

澄清:
如果你有一个 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 - 表示空 XML 元素的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/774192/

相关文章:

java - XSD 中元素类型的“OR”运算

java - 使用 Apache POI 读取 Excel、XML MAP 元素名称

java - 当返回的对象之一为 null 时,Java If 语句的缩写形式返回 NullPointerException

python - 对使用哪个 XML 处理选项感到困惑

ios - NSXMLParser parserDidStartDocument 卡住应用程序

c - 用 fread 读取一个空文件

c# - 什么是NullReferenceException,如何解决?

java unmarshalling - NULL 值或缺少标记?

XSLT删除不需要的元素

java - JAXB 从 java 生成 nillable = "true"