我对属性的命名空间以及如何在 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,但很少使用它。但是,还应该使用 Xerces 针对模式验证 XML 文件,并且在那里我遇到了一些问题。
问题可能是我没有正确指定架构,而不是 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">
架构文件声明类似于以下的信息:
<xs:schema xmlns:abcd="http://www.mycompany.se/abcd" xmlns:xs="
http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.mycompany.se/abcd"
elementFormDefault="qualified" attributeFormDefault="unqualified">
您能否给出一些提示,我应该如何声明 XML 模式以使用 xml:id 验证 XML 文件?
问候/米凯尔