2013-04-08 23 views
0

我有一些XML有一個xmlns聲明如下:XML - 單個xmlns定義中的雙重URI,是否有效?

<dc:record xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mods="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-0.xsd"> 

此行似乎絆倒在Python中eTree XML解析器:

lxml.etree.XMLSyntaxError: xmlns:mods: 'http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-0.xsd' is not a valid URI, line 6, column 63 

如果我刪除發現的兩個URI之一在xmlns:mods聲明中,它解析得很好。

因此,知道xmlns元素有助於人類解析,並且不是特別需要推定,這是對XML的真正約束(在xmlns命名空間聲明中使用單個URI)還是它lxml etree解析器的過度執行?

+0

一個挑剔:'xmlns'不適用於人類 - 它是實際的命名空間,並且命名空間*必須是一個URI(可以不參考)。這是用於人類的*前綴*。 – 2013-04-08 03:20:36

+0

@FrancisAvila啊,很好,謝謝。考慮我的挑戰,挑選。 – 2013-04-08 03:30:01

回答

3

我認爲lxml.etree在這裏做正確的事情。

根據the spec,命名空間聲明屬性必須有一個值,該值是「要麼一個IRI參考 - 名稱空間名稱識別的命名空間 - 或空字符串」

你的實施例具有的屬性值"http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-0.xsd",這是不是有效的IRI(冒號在錯誤的地方,例如)

+0

我傾向於同意。我很欣賞你的想法。它總是有用的獲得外部/專家對這些事情的看法。謝謝。 – 2013-04-08 03:31:14

1

命名空間名稱是否必須是有效的URI的問題是一個煩惱的問題。當然你在這裏有什麼是錯的;但是你的解析器是否「過分熱心」是另一回事。

命名空間1.1規範在第8節中指出:「處理器必須報告名稱空間格式良好的違規行爲,但不需要檢查名稱空間名稱是合法的IRI」。

實際上,大多數解析器不會執行此檢查,一旦大多數軟件產品對規範中的規定執行寬鬆,執行該規定的軟件開始變得不受用戶歡迎。

+0

一個很好的答案,謝謝。我想在這方面,兩者都是正確的。解析器正在做它的工作,並且聲明(IRI的形成)符合公共約定。 – 2013-04-08 09:56:04