公共父元素在XML中出现的顺序是XML文档捕获的有意义的数据,还是未指定为有意义的顺序?例如,考虑两个XML文档:
<people>
<person name="sam"/>
<person name="juni"/>
</people>
Run Code Online (Sandbox Code Playgroud)
和
<people>
<person name="juni"/>
<person name="sam"/>
</people>
Run Code Online (Sandbox Code Playgroud)
这些文件是否被视为代表相同的数据,还是被捕获的顺序不同?
Ada*_*uth 51
元素的顺序在XML中很重要,因此在您的示例中,两个文档是不同的.但是,属性顺序并不重要.
<people>
<person name="kathy" id="1"/>
</people>
Run Code Online (Sandbox Code Playgroud)
这完全相同:
<people>
<person id="1" name="kathy"/>
</people>
Run Code Online (Sandbox Code Playgroud)
l0b*_*0b0 23
它们并不相同 - 序列是否重要取决于程序或处理它的用户.例如,XHTML文档中的元素序列决定了它们在浏览器中的显示方式,搜索引擎使用文档中的位置来判断数据的相对重要性.
Jon*_*eet 20
订单可能很重要,但这取决于传输的内容.
例如,在XHTML中,顺序非常重要 - 如果你有一个随机顺序的兄弟段落,那将是非常令人困惑的!
在许多其他情况下,它并不重要.
XML只是表示节点树的一种方式.XML本身表示订单很重要:例如,API必须保留订单 - 但这取决于产生/解释数据的真正关心订单与否.
XML规范实际上必须"在排序方面犯错" - 如果您不关心它,很容易忽略排序,但如果API决定转换,那么重建排序是一件痛苦的事.(您必须将订单放入属性等)
从纯粹的XML有效性角度来看,它取决于描述用于格式化XML的规则的模式(如果有的话).
也就是说,必须保留顺序(参见http://www.w3.org/TR/xml-infoset/中的 2.1.1 ),但它对应用程序的"重要性"取决于作者.
在模式中,使用xs:all合成器可以使顺序变得不重要,但我不确定这是否会影响捕获顺序的保留,即我仍然期望XML处理器维护原始/序列化的顺序.
但是,在1.0中,此合成器会对子元素添加限制,以使它们必须出现0或1次.在XSD 1.1中,删除了此限制,使合同更容易指定订单不重要,实际上xs:all已成为无序版本xs:sequence.
由于过度限制的1.0 xs:all合成器,xs:sequence必须使用有序合成器.因此,订单通常是人为强加的.
验证器库供应商采用1.1的速度很慢.
因此,API在使用新元素进化时需要考虑顺序.我不知道任何可以使用1.1的XML序列化框架,你必须假设你的客户端将使用1.0并将使用1.0规则验证1.1传入消息并阻塞.
卢克
它们是有区别的。您可以使用各种 XML API 按顺序处理元素或按索引查找元素。当然,在您的特定示例中顺序可能并不重要,但这取决于数据的语义。