【问题标题】:Validating XML with attributes in namespace "xml"使用命名空间“xml”中的属性验证 XML
【发布时间】:2013-01-08 22:49:49
【问题描述】:

我有一个关于属性命名空间以及如何声明的问题 XML 模式中的此类属性。

我想为属性使用命名空间的原因是我使用 XML 数字信号, 并且签名部分应使用“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">

您能否给出一些提示,我应该如何声明 XML 模式以验证 带有 xml:id 的 XML 文件?

问候 /迈克尔

【问题讨论】:

    标签: xml


    【解决方案1】:

    一种简单的方法是添加

    <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>
    

    &lt;xs:import&gt;这个schema进入你的主schema然后声明

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

    在适当的地方。

    【讨论】:

    • 感谢您的建议,这可能是一个可能的解决方案。但是,这不会验证属性的内容,我们希望也对该属性进行验证。是否有任何其他可能的方法可以将 xml:id 添加到也进行验证的架构中?
    • @MikaelSvenning 如果您想正确验证 xml:id 是有效 ID,我添加了一个替代方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多