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.
答案 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
。此设置使内部元素Leverancier
和Bestandsversie
没有命名空间。
另一件需要注意的事情是,虽然看到用户定义的内容定位于http://www.w3.org/2001/XMLSchema
命名空间是非常不寻常的,但XSD 1.0规范中没有明确禁止用户定位此命名空间的规定。这与您在示例XML http://www.w3.org/2001/XMLSchema-instance
中看到的其他命名空间不同:明确禁止在用户定义的XSD中将此命名空间作为目标。
This SO post也可能会有所帮助。