【问题标题】:Validation of current file using XML schema使用 XML 模式验证当前文件
【发布时间】:2014-02-12 06:05:27
【问题描述】:

这是我尝试针对架构 B.xsd 进行验证时得到的结果:

使用 XML 模式验证当前文件:错误:元素 '{http://NamespaceTest.com/OrderTypes/}University':没有匹配的全局 可用于验证根的声明。

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>

我想尝试这样的事情(作为练习):University(B) 使用 College(A) 及其子元素。我做错了什么?

【问题讨论】:

    标签: xml validation xsd xml-namespaces


    【解决方案1】:

    你的方法有两个问题:

    首先,尽管您已经在架构中定义了 University 类型,但该类型本身并不能简单地通过引用架构命名空间在实例文档中使用。在这种情况下,最简单的做法*是将根元素添加到 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" 
    

    *如果您阅读此答案下方的 cmets,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>
    

    【讨论】:

    • 你用your schema is not valid as no root element is defined. Every logical xsd schema requires a root element 说的不正确。我可以写 它可以在任何兼容的处理器上运行。根据 XML Schema Instance 的意图,它只是有效的......
    • 当然你是对的@petrugardea。我的意思是你不能创建一个模式的 xml 实例,除非它有一个根元素。
    • 不知何故,我认为您没有理解我的评论。你说your schema is not valid as no root element is definedcorrect 它,你已经创建了 &lt;xs:element type="University" name="University" /&gt; 我的意思是,你不需要最后一个元素来验证实例 XML。
    • @PetruGardea 我不明白。请原谅我的无知,但是您应该如何创建一个符合仅定义复杂类型的架构的实例文档?
    • 请尝试我上面已经显示的 &lt;dummy xsi:type="c:University" xmlns:c="..." ... &gt; 匹配前缀等。使用 .NET 或 Java 进行验证,看看你会得到什么。如果您认为这很奇怪,请阅读规范,思考 xsi:type 是如何工作的,或者 WSDL 规范如何处理使用 type 而不是 element 来定义消息部分的部分,等等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 2010-11-22
    • 1970-01-01
    相关资源
    最近更新 更多