2013-01-07 122 views
1

我對屬性的名稱空間以及如何在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

回答

0

一個簡單的方法是

<xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" 
       processContents="skip" /> 

添加到相關元素。這應該允許任何xml:屬性。如果你想實際驗證ID屬性,那麼你就需要把這個模式中定義一個單獨的模式爲xml命名空間

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://www.w3.org/1998/XML/Namespace"> 
    <xs:attribute name="id" type="xs:ID"/> 
</xs:schema> 

<xs:import>到你的主架構,然後在適當的位置聲明

<xs:attribute ref="xml:id" use="required" /> 

+0

感謝您的建議,這可能是一個可能的解決方案。但是,這不會驗證屬性的內容,我們還希望對此屬性也進行驗證。是否有任何其他可能的方法來添加xml:id到架構,這也是驗證? –

+0

@MikaelSvenning我已經添加了一個替代方案,如果你想正確驗證'xml:id'是一個有效的ID。 –