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

Rob*_*ska 160 xml null xml-nil

我看过null以下几种方式表示的元素:

元素存在于xsi:nil="true":

 <book>
     <title>Beowulf</title>
     <author xsi:nil="true"/>
 </book>
Run Code Online (Sandbox Code Playgroud)

该元素存在,但表示为一个空元素(我认为这是错误的,因为'空'并且null在语义上是不同的):

 <book>
     <title>Beowulf</title>
     <author/>
 </book>

 <!-- or: -->
 <book>
     <title>Beowulf</title>
     <author></author>
 </book>
Run Code Online (Sandbox Code Playgroud)

返回的标记中根本不存在该元素:

 <book>
     <title>Beowulf</title>
 </book>
Run Code Online (Sandbox Code Playgroud)

该元素有一个<null/>子元素(来自下面的TStamper):

 <book>
     <title>Beowulf</title>
     <author><null/></author>
 </book>
Run Code Online (Sandbox Code Playgroud)

是否有正确或规范的方式来表示这样的null价值?还有其他方法吗?

以上示例的XML是人为设计的,所以不要过多地阅读它.:)

Kit*_*YMG 115

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

如果使用空标记,则getElementValue()返回空字符串("")如果省略标记,则甚至不存在author标记.这可能在语义上不同于将其设置为'nil'(例如,将"系列"设置为nil可能是该书属于无系列,而省略系列可能意味着该系列是当前元素的不适用元素.)

来自:W3C

XML Schema:Structures引入了一种机制,用于表示一个元素应该被接受为有效·当它没有内容时,尽管内容类型不需要或甚至不允许空内容.如果元素具有值为true的属性xsi:nil,则该元素可以是有效的而没有内容.如此标记的元素必须为空,但如果相应的复杂类型允许,则可以携带属性.

澄清:
如果你有一本书的xml元素,其中一个子元素是book:series,你可以在填写它时有几个选项:

  1. 完全删除元素 - 当您希望表明该系列不适用于本书或该书不属于系列时,可以执行此操作.在这种情况下,xsl转换(或其他基于事件的处理器)具有与book:series匹配的模板永远不会被调用.例如,如果您的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"允许元素没有数据.另一个例子是十进制类型的元素.如果你想让它们为空,你可以联合一个只允许""和小数的枚举字符串,或者使用一个可以为空的小数.

  • 使用xsi:nil是正确的,但是你应该确保它在正确的命名空间内:xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" (11认同)
  • 嘿,我相信这仍然有点不对劲.它应该是`xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"`.注意"www.".见http://www.w3.org/TR/xmlschema-1/#no-xsi (9认同)
  • @ChrisV:不是,必须声明`xsi:`前缀.如果您尝试使用`xsi:`前缀而不声明它,则名称空间感知的XML解析器将拒绝您的XML文档.这里的相关规范是http://www.w3.org/TR/xml-names/#nsc-NSDeclared("Namespace constraint:Prefix Declared"),它说唯一预定义的前缀是`xml:`和`xmlns:` .XML Schema构建在XML命名空间规范之上,但不会向其添加任何其他预定义前缀,因为这样做实际上会违反XML命名空间规范. (2认同)

Sta*_*Man 9

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


Tor*_*kår 8

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

[ 来源 ]


Oak*_*ool 6

w3链接中的文档

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

说这是推荐的形式.

<test></test>
<test/>
Run Code Online (Sandbox Code Playgroud)

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

XML Schema:Structures引入了一种机制,用于表示一个元素应该被接受为有效·当它没有内容时,尽管内容类型不需要或甚至不允许空内容.如果元素具有值为true的属性xsi:nil,则该元素可以是有效的而没有内容.如此标记的元素必须为空,但如果相应的复杂类型允许,则可以携带属性.

澄清这个答案:内容

  <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>
Run Code Online (Sandbox Code Playgroud)

  • 这是*empty*元素的推荐; 你是否认为空=== null?我相信这两者之间存在差异,尽管它通常是情境性的.如果您声明它们是相同的,我建议您在答案中提及该论点. (7认同)