使用XML模式验证当前文件

时间:2014-02-12 06:05:27

标签: xml validation xsd xml-namespaces

这是我在尝试验证模式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)及其子元素。我做错了什么?

1 个答案:

答案 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>