-1

这是我的问题:我有一个包含一些值的 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>
4

1 回答 1

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>
于 2013-09-16T07:00:12.377 回答