3

这是<schema>我的 XSD 的标签:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.cmu.edu/ns/blank"
    targetNamespace="http://www.cmu.edu/ns/blank"
    elementFormDefault="qualified">  

如果我的理解是正确的,这就是它的意思:

  • 此架构本身属于http://www.w3.org/2001/XMLSchema命名空间
  • XML 实例的根应该属于http://www.cmu.edu/ns/blank命名空间
  • XML 实例中没有前缀的所有元素都自动属于限定http://www.cmu.edu/ns/blank命名空间elementFormDefault
  • 问题1:我的理解是否正确。如果没有,有什么问题?

    Question2看下面提到的 XML 实例:

    <people
    xmlns="http://www.cmu.edu/ns/blank"
    xmlns:xsi="http://www.w3c.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.cmu.edu/ns/blank student.xsd"
    >
        <student>
            <name>John</name>
            <course>Computer Technology</course>
            <semester>6</semester>
            <scheme>E</scheme>
        </student>
    </people>  
    

    这里一切都属于http://www.cmu.edu/ns/blank命名空间,包括<student>由于elementFormDefault. 正确的?

    Question3
    现在,我想<student>从各个大学添加。berk带有像Berkley、harvHarvard 等的前缀。每个<student>都有不同的元素集。我想验证这一点。这怎么可能?

    4

    2 回答 2

    6

    (1)前两点OK;第三个:

    All the elements within the XML instance which do not have a prefix automatically belong to http://www.cmu.edu/ns/blank namespace as elementFormDefault is qualified

    是不正确的。

    在架构中声明前缀并不意味着 XML 实例必须使用相同的前缀。XSD 文件中的任何命名空间声明仅适用于 XSD 的 XML 文件(XSD 是 XML,因此...)

    一般来说,没有办法假设任何带前缀或不带前缀的元素名称。即下面的例子都是正确的。

    <some xmlns="" .../>
    <some xmlns="urn:tempuri-org:XSD:1" .../>
    <x:some xmlns:x="urn:tempuri-org:XSD:1" .../>
    

    唯一可以确定的是,表示非限定名称的唯一方法是通过没有前缀的名称(即不能为“空”名称空间添加前缀)。

    elementFormDefault当元素在内容模型中声明时(即不是全局的),控制元素名称的形式。

    (2) 部分正确。部分because of elementFormDefault.不正确。同样,XSD 只是一种模式规范。XML 存在并且有自己的规则,与 XSD 或任何其他模式语言无关。此处适用的规则是XML 名称空间的规则,特别是范围

    (3) 您必须为每个命名空间创建一个 XSD;在每个命名空间中,您声明学生及其内容。然后定义人员的 XSD 将导入其他 XSD 并适当地引用学生。

    所以这是一个基本的设置:

    伯克利.xsd

    <?xml version="1.0" encoding="utf-8" ?>
    <!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
    <xsd:schema targetNamespace="urn:berkeley-org" xmlns="urn:berkeley-org" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <xsd:element name="student"/>   
    </xsd:schema>
    

    哈佛.xsd

    <?xml version="1.0" encoding="utf-8" ?>
    <!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
    <xsd:schema targetNamespace="urn:harvard-org" xmlns="urn:harvard-org" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <xsd:element name="student"/>   
    </xsd:schema>
    

    人.xsd

    <?xml version="1.0" encoding="utf-8" ?>
    <!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
    <xsd:schema targetNamespace="urn:people-org" xmlns="urn:people-org" xmlns:harv="urn:harvard-org" xmlns:berk="urn:berkeley-org" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <xsd:import namespace="urn:harvard-org"  schemaLocation="harvard.xsd"/>
        <xsd:import namespace="urn:berkeley-org" schemaLocation="berkeley.xsd"/>
    
        <xsd:element name="people">
            <xsd:complexType>
                <xsd:choice maxOccurs="unbounded">
                    <xsd:element ref="harv:student"/>
                    <xsd:element ref="berk:student"/>               
                </xsd:choice>
            </xsd:complexType>
        </xsd:element>
    </xsd:schema>
    

    文件图:

    在此处输入图像描述

    示例 XML(显示名称空间的使用):

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
    <people xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:harv="urn:harvard-org" xmlns:berk="urn:berkeley-org" xmlns="urn:people-org">
        <harv:student/>
        <berk:student/>
    </people>
    

    在此处输入图像描述

    于 2013-05-11T03:09:35.090 回答
    2

    Petru 的答案是一个很好的答案,但它要求基本“人”模式了解(并导入)所有不同的大学特定模式 - 如果你想添加一所新大学,你必须更新基本模式以匹配。另一种方法是通过让基本模式声明一个基本“学生”类型来反转导入的方向,可能包含所有大学共有的元素,其他模式使用替换组机制进行扩展。

    人.xsd

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="urn:people"
        xmlns:p="urn:people"
        elementFormDefault="unqualified">
    
      <xs:element name="people">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="p:student" minOccurs="0" maxOccurs="unbounded" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    
      <xs:complexType name="studentType">
        <xs:sequence>
          <xs:element name="name" type="xs:string" />
        </xs:sequence>
      </xs:complexType>
    
      <xs:element name="student" type="p:studentType" />
    </xs:schema>
    

    哈佛.xsd

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="urn:harvard"
        xmlns:p="urn:people"
        elementFormDefault="unqualified">
      <xs:import namespace="urn:people"  schemaLocation="people.xsd"/>
    
      <xs:element name="student" substitutionGroup="p:student">
        <xs:complexType>
          <xs:extension base="p:studentType">
            <xs:element name="harvardId" type="xs:string" />
          </xs:extension>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    伯克利.xsd

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="urn:berkeley"
        xmlns:p="urn:people"
        elementFormDefault="unqualified">
      <xs:import namespace="urn:people"  schemaLocation="people.xsd"/>
    
      <xs:element name="student" substitutionGroup="p:student">
        <xs:complexType>
          <xs:extension base="p:studentType">
            <xs:element name="berkeleyId" type="xs:string" />
          </xs:extension>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    实例文件

    <p:people xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xmlns:harv="urn:harvard" xmlns:berk="urn:berkeley" xmlns:p="urn:people"
              xsi:schemaLocation="urn:people people.xsd urn:harvard harvard.xsd
                                  urn:berkeley berkely.xsd>
      <harv:student>
        <name>John</name>
        <harvardId>12345</harvardId>
      </harv:student>
      <berk:student>
        <name>Mary</name>
        <berkeleyId>ABCDE</berkeleyId>
      </berk:student>
    </p:people>
    

    请注意,我elementFormDefault="unqualified"在此示例中使用了简化实例文档中的名称空间。如果我使用过qualified,那么您将不得不说类似

    <harv:student>
      <p:name>John</p:name>
      <harv:harvardId>12345</harv:harvardId>
    </harv:student>
    

    (即,harv:student从基础继承的元素p:studentType必须在urn:people命名空间中,但在harvard.xsd扩展中声明的元素必须在urn:harvard命名空间中)。

    这里要理解的关键点是:

    • people模式声明了一个全局复杂类型studentType和该类型的全局元素student,并将people元素声明为{urn:people}student.
    • 每个大学特定的模式都声明了自己的元素,substitutionGroup="p:student"其类型为 extends p:studentType{urn:people}student这告诉验证器在任何预期 a 的地方,a{urn:college}student也是可以接受的。
    • 当您想添加一所新学院时,您只需创建一个类似的架构,其中包含一个新元素,substitutionGroup您可以在实例文档中引用它 - 无需更改people架构。
    于 2013-05-13T11:58:20.937 回答