2010-11-05 71 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