1

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>

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

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

1 回答 1

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. 此设置使内部元素Leverancier没有Bestandsversie命名空间。

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

这篇 SO 帖子也可能会有所帮助。

于 2013-02-10T18:28:58.710 回答