XSD:不期望具有命名空间的元素

时间:2015-02-26 07:37:21

标签: xml validation xsd schema

我有一个简单的XSD架构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="urn:myNamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" elementFormDefault="qualified" attributeFormDefault="unqualified" id="myList">
    <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd"/>
    <xs:element name="abc">
      <xs:complexType>
        <xs:sequence>
                <xs:element name="testElement" />
                <xs:element name="Signature" type="ds:SignatureType"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

和XML文件,我要验证:

<?xml version="1.0" encoding="UTF-8"?>
<abc>
    <testElement>
    </testElement>
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
        <SignedInfo>
            <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
            <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
            <Reference URI="">
                <Transforms>
                    <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                </Transforms>
                <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                <DigestValue>value1</DigestValue>
            </Reference>
        </SignedInfo>
        <SignatureValue>value2</SignatureValue>
        <KeyInfo><KeyName/></KeyInfo>
    </Signature>
</abc>

我使用xmllint,我收到以下错误:

file.xml:5: element Signature: Schemas validity error : Element '{http://www.w3.org/2000/09/xmldsig#}Signature': This element is not expected. Expected is ( Signature ).
file.xml fails to validate

我对XML命名空间做错了什么?是XSD还是XML中的问题?

1 个答案:

答案 0 :(得分:3)

自您在架构中声明

<xs:element name="Signature" type="ds:SignatureType"/>

它希望<Signature>没有绑定到任何命名空间(与导入的模式中声明的命名空间不同)。 您似乎想要插入<Signature>命名空间中定义的"http://www.w3.org/2000/09/xmldsig#",因此您应该在模式中使用以下内容:

<xs:element ref="ds:Signature" />