XML 架构 : root element

标签 xml xsd

下面的帖子问的是如何表明一个元素是根元素 一个 XML 架构:

Is it possible to define a root element in an XML Document using Schema?

我已经按照 w3schools 的 XML Schema 教程进行操作,但仍有一些问题不清楚。 考虑来自 https://www.w3schools.com/xml/schema_example.asp 的示例模式 2 (为方便起见转载如下)。此代码如何表示 <shiporder> 是根元素?这个例子不是说所有元素 作为根元素有效吗?

----------------实例------------------------ ------

<?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> 

---------------------- 模式 ---------------------- -

<?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>

在我看来,XML Schema 应该做两件事:

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

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

最佳答案

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

不过,您可以通过很好地设计 XML 模式来解决这个问题,这样只有一个全局定义的元素 - 然后只有这个元素作为根元素有效。

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

关于XML 架构 : root element,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8854144/

相关文章:

c# - 如何调用 XML api

java - 第一次使用 XML,这个错误是什么意思?

android - XML 中 EditText 的提示大小

c# - 根据子元素的值获取父元素

c# - 如何在 Visual Studio 2010 中从 xsd 模式创建数据集

java - 是否有一个公共(public)位置包含所有 Spring XML 的声明

java - 反转 ListView 顺序并显示而不滚动

xml - FOP 的好替代品?

wcf - 为什么公共(public)属性(property)没有被序列化?