2009-04-08 63 views
4

我一直在努力確認自己對XML規範的閱讀。我的解釋是,預先定義的實體和數字字符引用未在標籤名稱中不允許和屬性的名稱,例如這不是由XML 1.0規範:格式良好的XML?標記名稱和屬性名稱中的XML引用

<root> 
<test&apos;&#x27;&#39;tag test&apos;&#x27;&#39;attribute="one"/> 
</root> 

但是允許的,我有一個解析器返回test'''tag的標籤名稱和test'''attribute了屬性名稱,而另一個分析器返回test&apos;&#x27;&#39;tag的標籤名稱和test&apos;&#x27;&#39;attribute的屬性名稱。

哪個解析器是正確的?或者他們都錯了(即他們應該拋出一個良好的錯誤)?

謝謝!

+0

你有一些好的解析器在那裏!我掌握的每個XML解析器都正確地確定上述示例不合格。 – bobince 2009-04-09 01:23:54

回答

2

這很簡單:沒有實體可以在名稱內使用。這兩個「解析器」都是錯誤的。 XML規範相當明確地定義了這一點 - 沒有隱藏的默認規則;如果某個構造不包含在內,則不允許。

實體只能在常規字符內容和屬性值內使用。它們可以包含在其他一些地方(註釋,處理指令,DTD子集),但不會被擴展(即不被識別爲實體)。

0

。在w3.org周圍挖掘,我發現下面的相關部分:

[41]屬性:: =姓名式AttValue [VC:屬性值類型] [WFC:無外部實體引用] [WFC :無外部實體引用]鏈接:

規範性約束:無外部恩在屬性值]

[WFC沒有<實體參考文獻
屬性值不能包含對外部實體的直接或間接實體引用。

名稱鏈接到:

[5]名稱:: = NameStartChar(NameChar)*

[4] NameStartChar :: = 「:」 | [A-Z] | 「_」| [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]

[4a] NameChar :: = NameStartChar | 「 - 」| 「」 | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]

是的,它就像泥土一樣清晰!我對此的解釋是,只要它們落在上面指定的範圍內,就可以使用十六進制實體引用,但不能使用預定義的引用。

當名稱不符合這個要求時,我會期待一個格式良好的錯誤。

+0

謝謝,26的17! 我實際上傾向於根本沒有實體引用,因爲&似乎完全不允許(參見dommer的回答)。 – ScottProuty 2009-04-08 20:04:58

+0

我當然從未見過他們以這種方式使用,並親自將避免它。 – 2009-04-08 21:05:24

2

在我看來,他們都是錯的。按照spec,只有下列字符應該是一個開始標記:

":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] 

XMLSpy的肯定是不樂意與它的。也不是<氧氣/ >。

而...只是爲了好的措施......這裏就是.NET不得不說一下吧:

The '&' character, hexadecimal value 0x26, cannot be included in a name. Line 1, position 12. 

您正在使用什麼解析器?