XML不会针对某些XSD进行验证

时间:2013-02-09 15:19:03

标签: xml xsd prefix xml-validation xml-error

XML(简化):

<?xml version="1.0" encoding="UTF-8"?>
<mx:XMLimport xmlns:mx="http://www.w3.org/2001/XMLSchema" 
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Leverancier>nn</Leverancier>
    <Bestandsversie>1.1.0.0</Bestandsversie>
</mx:XMLimport>

XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            elementFormDefault="qualified">
    <xsd:element name="XMLimport">
        <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="Leverancier" type="xsd:string" minOccurs="1"/>
              <xsd:element name="Bestandsversie" type="xsd:string" minOccurs="1"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

如果我从XML的根元素中删除mx:前缀,则验证就好了。我迷失了名字空间,现在我正在互联网上搜索几个小时。我无法更改XML,因此必须调整XSD以允许mx:前缀。验证器给出了这个错误:

ERROR: Element '{http://www.w3.org/2001/XMLSchema}XMLimport':
       No matching global declaration available for the validation root.

1 个答案:

答案 0 :(得分:2)

我认为你的问题是XSD应该与你的XML匹配。这是更正后的XSD:

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema targetNamespace="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="XMLimport">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="Leverancier" type="xsd:string"/>
                <xsd:element name="Bestandsversie" type="xsd:string"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>  
</xsd:schema>

您的XSD未定义targetNamespace属性。因此, XMLimport 必须在实例文档中显示没有名称空间;这就是为什么当您从XML文档中的 XMLimport 中删除命名空间时,它将变为有效。

如果添加targetNamespace="http://www.w3.org/2001/XMLSchema",您现在将拥有一个将验证XML的XSD;通常,targetNamespace的值必须与文档元素的命名空间匹配(变色龙XSD是一种特殊情况)。

此处的另一件事是elementFormDefault,默认情况下为unqualified。此设置使内部元素LeverancierBestandsversie没有命名空间。

另一件需要注意的事情是,虽然看到用户定义的内容定位于http://www.w3.org/2001/XMLSchema命名空间是非常不寻常的,但XSD 1.0规范中没有明确禁止用户定位此命名空间的规定。这与您在示例XML http://www.w3.org/2001/XMLSchema-instance中看到的其他命名空间不同:明确禁止在用户定义的XSD中将此命名空间作为目标。

This SO post也可能会有所帮助。