2010-11-05 59 views
8

换句话说:标签顺序是否与有效的XML相关?

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
<tag1> 
    <tag1.1></tag1.1> 
</tag1> 
<tag2 /> 
<root> 

是一样的:

<?xml version="1.0" encoding="UTF-8"?> 
    <root> 
    <tag2 /> 
    <tag1> 
     <tag1.1></tag1.1> 
    </tag1>  
    <root> 

回答

10

尽管详细信息如他们所示,但您的两个示例在语义上是相同的。

这是一个常见的XML误解,在格式良好的XML文档中,兄弟元素的顺序很重要。 XML 1.0 spec指定属性是无序的,但它没有提到元素。因此,XML处理器可以按照喜欢的顺序自由报告元素兄弟。这就是说,我不认为任何常用的XML处理器报告元素的顺序与他们在文档中出现的顺序不同。

您询问“有效”文档 - 这意味着正在使用DTD或模式,因此可能(或不可能)订单相关。 DTD或模式有机制来指定元素顺序在文档中是相关的。但是,您的示例不显示使用DTD或模式。

+0

实际上有一个DTD。谢谢。 – Segolas 2010-11-05 13:55:39

+0

“这是对XML常见的误解,在格式良好的XML文档中元素的顺序非常重要。”这不是误会。见3.2.1。当然,一个XML处理器能够处理序列约束,并且仍然以不同的顺序返回元素。它也可以腐蚀所有的文本节点。 – 2010-11-05 15:27:08

+0

@罗伯特罗斯尼 - 我已经编辑过,转换为“兄弟元素”,但是,我没有看到3.2.1与格式良好的文档中兄弟元素排序的相关性。你能详细说明一下吗? – philhobgen 2010-11-06 21:52:52

1

它取决于您的语言定义的DTD(或模式)。

1

这取决于消耗XML的内容。元素的顺序可能并不重要,因为XML文档格式良好(取决于XSD),但某些程序/ API希望按字母顺序读取XML(例如.NET中的DataContractSerializer)。

此外,顺序可能在语义上很重要(例如,如果XML代表文档,顺序非常重要)。

+3

我会更明确地区分* valid *(即符合某个DTD /模式)和* well-formed *(即语法上合法的XML)。现在我很想说这个参数是不正确的,因为它使用单词“有效”的方式。 – 2010-11-05 11:59:14

+0

@Andrzej - 好点。我更新了我的答案,使用格式正确而不是有效的。 – RQDQ 2010-11-05 12:06:50

+1

元素的顺序从来就不会很重要,因为它的结构良好,XSD与良好的结构无关。 – Quentin 2010-11-05 12:08:35

0

XML维护文档的顺序 - 这些被认为是两个不同的文档。

您的应用程序可能会或可能不会考虑元素的顺序是重要的。例如,元素的顺序在XHTML中很重要。如果您正在对模式或类似模式进行验证,则取决于模式是否两个文档都有效。

请注意,属性的顺序并不重要(但仅在元素上属性顺序不同的XML文档被认为是相同的)。

4

这对XML本身并不重要。这两个文档当然是格式良好的 XML文档。但是,它们可能不是有效;当使用XML Schema进行验证时,可以指定一个订单,而不是按照该订单提供这些元素,这将使该文档根据模式无效。这可以通过xsd:sequence元素来完成here