两种不同的xmlns:XML Schema中的xs

时间:2013-09-16 05:55:26

标签: xml xsd schema xml-namespaces

这是我的问题: 我有一个xml文件,其中包含一些值,此文件也是证书签名。 我的xsd模式文件知道如何只处理值,而在添加签名行时,模式失败。 错误是: 元素“标题”在名称空间“http://www.w3.org/2000/09/xmldsig#”中具有无效的子元素“签名”。可能的元素列表'签名' 这是我的代码, 谢谢:))

文件test.xml:

<Header>
<tank>
    <code>1</code>
    <level>0</level>
</tank>

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
    <SignedInfo>
        ...
    <SignedInfo>
</Signature>
</Header>

SchemaTest.xsd:

<?xml version="1.0"?>
<xs:schema id="SchemaTest"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefalut="qualified"
attributeFormDefault="unqualified">
<xs:element name="Header">
    <xs:complexType>
    <xs:sequence>
        <xs:element name="tank">
        <xs:complexType>
        <xs:sequence>
            <xs:element name="code"/>
            <xs:element name="level"/>
            </xs:sequence>
        </xs:complexType>
        </xs:element>           
        <xs:element name="Signature">
                <xs:complexType>
                <xs:sequence>
                    <xs:element name="SignedInfo">
                    <xs:complexType>
                    <xs:sequence>
                    </xs:sequence>
                    </xs:complexType>
                    </xs:element>
                </xs:sequence>
                </xs:complexType>
        </xs:element>
        </xs:sequence>
        </xs:complexType>
</xs:element>
</xs:schema>

1 个答案:

答案 0 :(得分:1)

您需要第二个架构来描述Signature命名空间。以下代码基于两个不同的命名空间为xml文件构建了一个简单示例。

这是第二个命名空间架构......

<?xml version="1.0" encoding="UTF-8"?>
<!-- second namespace schema -->
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://my.second.namespace" 
    xmlns:tns="http://my.second.namespace" 
    elementFormDefault="qualified">
    <element name="SomethingElse" type="string"></element>
</schema>

主命名空间的架构......

<?xml version="1.0" encoding="UTF-8"?>
<!-- first namespace schema -->
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://my.first.namespace" xmlns:tns="http://my.first.namespace"
    xmlns:S="http://my.first.namespace"      
    xmlns:T="http://my.second.namespace"
        elementFormDefault="qualified">
    <import namespace="http://my.second.namespace"
        schemaLocation="./SecondNamespaceSchema.xsd"/>
    <element name="Root">
        <complexType>
            <sequence>
                <element name="Head">
                    <complexType>
                        <sequence>
                            <element name="Something" type="string"></element>
                            <element ref="T:SomethingElse"/>
                        </sequence>
                    </complexType>
                </element>
                <element name="Body" type="string"></element>
            </sequence>
        </complexType>
    </element>
</schema>

...以及将所有内容放在一起的示例xml。

<?xml version="1.0"?>
<!-- validatable xml file - proved with eclipse validator -->
<S:Root xmlns:S="http://my.first.namespace"
    xmlns:T="http://my.second.namespace" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://my.first.namespace ./Sample.xsd">
   <S:Head>
        <S:Something/>
        <T:SomethingElse/>
   </S:Head>
   <S:Body>
   </S:Body>
</S:Root>