我對屬性的名稱空間以及如何在XML模式中聲明 這樣的屬性有疑問。使用名稱空間「xml」中的屬性驗證XML
我想爲屬性使用名稱空間的原因是我使用XML DSig, 並且簽名部分應該用「ID」屬性指定。
指定標識的屬性的名稱可以具有任何 名稱,並且一些可能的選擇是「ID」,「Id」或「id」。
但是,似乎有建議使用「xml:id」,而不是「ID」之類的其他任何內容。
這是例如在以下頁面描述: http://www.w3.org/TR/xml-id/
這工作得很好DSig的簽名。 我在我的C++應用程序中使用「xmlsec1」進行簽名/驗證,並且我能夠簽名並驗證簽名。
在XML文件中,ID被指定這樣的:
<elm:MyElement xml:id="MyName" OtherAttribute="SomeValue">
注意,「XML:ID」是一個命名空間,這是很少使用 儘管合法的XML屬性。 但是,這些XML文件也應該根據具有 Xerces的架構進行驗證,並且它存在一些問題。
問題可能是我沒有正確指定模式,而是比Xerces-C中的一個問題 。
我試圖指定屬性名稱爲:在這樣的方案「XML ID」:
<xs:attribute name="xml:id" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="MyName"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
然而,當我嘗試驗證文檔,我收到以下錯誤信息:
Error at file XMLParserInput, line 1, char 441
Message: attribute '{http://www.w3.org/XML/1998/namespace}id' is not
declared for element 'Routing'
我的XML文檔有一個「XML:id」屬性,但Xerces的驗證 似乎並不認爲 ,這個屬性是按照模式中聲明。
我現在的問題是我應該如何編寫XML模式以使其接受 「xml:id」?
我已在網上搜索,我也得到了一些暗示,比如這個:
http://xsd.stylusstudio.com/2004Oct/post01004.htm
但我的XML架構較爲複雜,並且包括幾個XSD文件 和多個命名空間, 所以我一直無法使它與Xerces驗證。
我的XML文件聲明類似下面的東西:
<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:qwerty="
http://www.mycompany.se/qwert" xmlns:abcd="http://www.mycompany.se/abcd">
模式文件(S)宣佈類似的信息:
<xs:schema xmlns:abcd="http://www.mycompany.se/abcd" xmlns:xs="
http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.mycompany.se/abcd"
將elementFormDefault = 「合格」 attributeFormDefault = 「不合格」 >
您能否提供一些提示,我應該如何聲明XML模式以驗證使用xml:id的 XML文件?
問候 /的Mikael
感謝您的建議,這可能是一個可能的解決方案。但是,這不會驗證屬性的內容,我們還希望對此屬性也進行驗證。是否有任何其他可能的方法來添加xml:id到架構,這也是驗證? –
@MikaelSvenning我已經添加了一個替代方案,如果你想正確驗證'xml:id'是一個有效的ID。 –