使用命名空间“xml”中的属性验证XML

时间:2013-01-07 14:44:34

标签: 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">

模式文件声明类似于此的信息:

<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”&gt;

你能给出一些提示,告诉我如何声明XML模式来验证 带有xml:id?

的XML文件

此致 /的Mikael

1 个答案:

答案 0 :(得分: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" />

在适当的地方。