这是我在尝试验证模式B.xsd:
时得到的结果使用XML架构验证当前文件:错误:元素 '{http://NamespaceTest.com/OrderTypes/}大学':没有匹配的全球 声明可用于验证根。
XML:
<p:University xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://NamespaceTest.com/B B.xsd"
xmlns:p="http://NamespaceTest.com/B/"
xmlns:cmn="http://NamespaceTest.com/A/">
<cmd:College>
<cmd:Dept>
<cmd:Course>
<cmd:Teacher>a</cmd:Teacher>
<cmd:Student>b</cmd:Student>
</cmd:Course>
</cmd:Dept>
</cmd:College>
</p:University>
B.XSD(大学):
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:c="http://NamespaceTest.com/A" elementFormDefault="qualified" targetNamespace="http://NamespaceTest.com/B" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import schemaLocation="A.xsd" namespace="http://NamespaceTest.com/A" />
<xs:complexType name="University">
<xs:sequence>
<xs:element name="Col" type="c:College" />
</xs:sequence>
</xs:complexType>
</xs:schema>
A.XSD(学院):
<xs:schema targetNamespace="http://NamespaceTest.com/A" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">
<xs:complexType name="College">
<xs:sequence>
<xs:element name="Dept">
<xs:complexType>
<xs:sequence>
<xs:element name="Course">
<xs:complexType>
<xs:sequence>
<xs:element name="Teacher" type="xs:string" />
<xs:element name="Student" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
我想尝试这样的事情(就像练习一样):大学(B)使用大学(A)及其子元素。我做错了什么?
答案 0 :(得分:1)
您的方法存在两个问题:
首先,虽然您已在架构中定义了 University 类型,但仅通过引用架构命名空间,该类型在实例文档中并不具备。在这个实例*中最简单的做法是在你的大学类型的模式中添加一个根元素:
<xs:schema xmlns:c="http://NamespaceTest.com/A"
elementFormDefault="qualified"
targetNamespace="http://NamespaceTest.com/B"
xmlns="http://NamespaceTest.com/B"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import schemaLocation="A.xsd" namespace="http://NamespaceTest.com/A" />
<xs:complexType name="University">
<xs:sequence>
<xs:element name="Col" type="c:College" />
</xs:sequence>
</xs:complexType>
<!-- Root element -->
<xs:element type="University" name="University" />
</xs:schema>
注意:如果您要添加根元素,则还需要添加根命名空间声明:
xmlns="http://NamespaceTest.com/B"
*如果你阅读了这个答案下面的评论,Petru概述了一种从没有定义根元素的模式引用类型的方法。
其次,类型 College 虽然在A.xsd中定义,但在逻辑上“属于”B.xsd(因为B.xsd已导入A.xsd),所以你的xml实例不需要明确知道A.xsd中的类型。
因此,您只需要引用单个目标命名空间http://NamespaceTest.com/B
即可访问所有类型:
<ns0:University xmlns:ns0="http://NamespaceTest.com/B">
<ns0:Col>
<Dept>
<Course>
<Teacher>a</Teacher>
<Student>b</Student>
</Course>
</Dept>
</ns0:Col>
</ns0:University>