使用命名空间针对Schema验证XML

时间:2014-06-24 14:44:45

标签: xml xsd-validation

我有几个XML文件,我必须根据程序中的Schema进行验证。我有本地存储的Schema文件,当我获得XML文件时,我知道要应用哪个模式。当我尝试根据模式验证我的一个XML文件时,我遇到一个奇怪的错误,并且此模式使用import语句导入某个名称空间。这是我想要应用于我的XML的示例XSD:

<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:test="http://www.test.com/test" xmlns:tns="http://www.test.com/test/folder/targetnamespace" targetNamespace="http://www.test.com/test/folder/targetnamespace" elementFormDefault="qualified">
    <import namespace="http://www.test.com/test" schemaLocation="test.xsd"/>
    <element name="tag1">
        <complexType>
            <sequence minOccurs="1" maxOccurs="1">
                <choice>
                    ...
                    ...
                </choice>
                ...
                ...
                <element name="..." type="..." minOccurs="1" maxOccurs="unbounded"/>
            </sequence>
        </complexType>
    </element>
    <complexType name="tag2">
        <sequence>
            <choice minOccurs="1" maxOccurs="1">
                ...
                ...
            </choice>
            <element ref="test:entries" minOccurs="1" maxOccurs="1"/>
        </sequence>
    </complexType>
</schema>

test.xsd与此xsd文件位于同一位置。我试图针对此模式验证的XML如下所示:

<?xml version="1.0" encoding="utf-8"?>
<tag1 xmlns="http://www.test.com/test/folder/targetnamespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="http://www.test.com/test">
    <id>ABCDEF</id> 
    <profile>
        ...
        ...
        <test:entries>
          ...
          ...
        </test:entries>
    </profile>
</tag1>

关于出了什么问题的任何想法?我得到的XML中是否缺少模式文件的位置?我希望根据我在验证例程中加载的Schema文件验证此XML。有什么想法吗?

这是导入的架构:

<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://www.test.com/test/folder/targetnamespace"
    elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema"
    xmlns:tns="http://www.test.com/test">

    <complexType name="EntriesType">
        <sequence>
            ...
            ...
        </sequence>
    </complexType>

    <complexType name="...">
        ...
        ...
    </complexType>
    <element name="entries" type="tns:EntriesType"></element>
</schema>

1 个答案:

答案 0 :(得分:0)

我设法通过在验证器例程中加载XSD文件来摆脱这种情况。即使其中一个XSD文件被导入另一个,但即使在更正了对命名空间的所有引用之后,它也总是会失败。所以我决定在我的验证器例程中加载两个XSD文件,然后它开始工作。