XML Schema:根元素

joh*_*999 55 xml xsd

以下帖子询问如何指示元素是XML模式中的根元素:

是否可以使用Schema在XML文档中定义根元素?

我已经关注了XML Schema的w3schools教程,但有些事情仍然不明确.考虑来自http://www.w3schools.com/schema/schema_example.asp的示例模式2 (为方便起见,在下面转载).这段代码如何表明这<shiporder> 是根元素?是不是说所有元素都作为根元素有效的例子?

------------------ instance ------------------------------- ---

<?xml version="1.0" encoding="ISO-8859-1"?>

<shiporder orderid="889923"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="shiporder.xsd">
  <orderperson>John Smith</orderperson>
  <shipto>
    <name>Ola Nordmann</name>
    <address>Langgt 23</address>
    <city>4000 Stavanger</city>
    <country>Norway</country>
  </shipto>
  <item>
    <title>Empire Burlesque</title>
    <note>Special Edition</note>
    <quantity>1</quantity>
    <price>10.90</price>
  </item>
  <item>
    <title>Hide your heart</title>
    <quantity>1</xample saying that all elements are valid as root elements?quantity>
    <price>9.90</price>
  </item>
</shiporder> 
Run Code Online (Sandbox Code Playgroud)

----------------------- schema ------------------------

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- definition of simple elements -->
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>

<!-- definition of attributes -->
<xs:attribute name="orderid" type="xs:string"/>

<!-- definition of complex elements -->
<xs:element name="shipto">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="name"/>
      <xs:element ref="address"/>
      <xs:element ref="city"/>
      <xs:element ref="country"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="item">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="title"/>
      <xs:element ref="note" minOccurs="0"/>
      <xs:element ref="quantity"/>
      <xs:element ref="price"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="orderperson"/>
      <xs:element ref="shipto"/>
      <xs:element ref="item" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute ref="orderid" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>
Run Code Online (Sandbox Code Playgroud)

从我的角度来看,XML Schema应该做两件事:

  1. 定义每个节点内可能发生的事情
  2. 定义每个节点的放置位置

似乎这个例子在#2失败了.有什么建议?

Ano*_*sse 52

据我所知,任何全局定义的元素都可以用作根元素,而XML Schema没有用于指定根元素应该是什么的概念.

但是,您可以通过设计XML Schema来解决这个问题,以便只有一个全局定义的元素 - 然后只有这个元素作为根元素有效.

可以在W3Schools(标题使用命名类型)中找到此示例.此示例仅具有一个全局定义的元素,因此只有一个可能的根元素.

  • 谢谢,我认为 w3schools 站点上的示例 3 实际上可能是解决该问题的最佳方法,即首先定义所有简单和复杂类型,然后通过具有单个全局定义的元素来指定单个根元素。 (2认同)
  • 链接已经死了. (2认同)

Mic*_*Kay 21

不是每个人都同意它,但XML Schema无法指定根元素的事实是设计的.我们的想法是,如果<invoice>a在文档中唯一有效的情况下是有效的,那么如果它包含在其他内容中它同样有效.这个想法是内容应该是可重用的,并且不应该允许你阻止有人使用有效内容作为更大的内容的一部分.

(ID和IDREF作用于文档的事实反而违反了这个政策;但是这个语言是由一个相当大的委员会设计的.)

  • ID和IDREF是由一个完全不同的委员会在20年前的另一个组织中设计的. (5认同)

dav*_*and 16

是的,你是对的.xsd应该是:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- definition of attributes -->
<xs:attribute name="orderid" type="xs:string"/>

<!-- definition of complex elements -->
<xs:complexType name="shiptoType">
  <xs:sequence>
    <xs:element name="name" type="xs:string" />
    <xs:element name="address" type="xs:string" />
    <xs:element name="city" type="xs:string" />
    <xs:element name="country" type="xs:string" />
  </xs:sequence>
</xs:complexType>

<xs:complexType name="itemType">
  <xs:sequence>
    <xs:element name="title" type="xs:string" />
    <xs:element name="note" minOccurs="0" type="xs:string" />
    <xs:element name="quantity" type="xs:string" />
    <xs:element name="price" type="xs:string" />
  </xs:sequence>
</xs:complexType>

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="orderperson" type="xs:string" />
      <xs:element name="shipto" type="shiptoType"/>
      <xs:element name="item" maxOccurs="unbounded" type="itemType"/>
    </xs:sequence>
    <xs:attribute ref="orderid" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>
Run Code Online (Sandbox Code Playgroud)

如你所见,现在只有一个xs:element,而且唯一一个可以成为有效的根元素:)