编辑和验证 XML 文件样本详细信息

示例概述

这是一些示例,它们告诉您如何使用 XML 编辑器中的某些向导式编辑功能部件来编辑和验证 XML 文件。有关编辑带有 DTD 和 XML 模式约束的 XML 文件的更多信息,请参阅 XML 编辑器联机帮助。

示例 描述
any 元素 这是一个高级示例,它告诉您如何使用 XML 模式规范中的 any 元素来扩展 XML 文档的内容模型。
发票 告诉您如何在编辑 XML 文件(Invoice.xml)时使用 DTD 文件(Invoice.dtd)来提供编辑辅助。
采购订单 告诉您如何在编辑 XML 文件(PurchaseOrder.xml)时使用 XML 模式文件(PurchaseOrder.xsd)来提供编辑辅助。

international 目录告诉您如何构建派生类型并在 XML 实例文档中使用 xsi:type 属性。

report.xsd 示例告诉您如何处理来自不同名称空间的多个模式。  

替换组 此示例告诉您如何在 XML 模式文件中定义替换组并接着在 XML 实例文档中使用该替换。


any 元素

此示例告诉您如何使用 XML 模式中的 any 元素来在 XML 文档中创建可扩展内容模型。此示例分为两个目录:

  1. anyNamespace - 告诉您如何使用 ##any 名称空间
  2. specifiedNamespace - 告诉您如何使用特定名称空间

使用 ##any 名称空间

anyNamespace 目录下面的 Book.xsd 模式具有一个复杂类型 BookTypeBookType 的内容为:title、author、year 和 isbn,然后可选择是否如 any 元素所指示的那样紧跟任何结构良好的 XML。
   <any namespace="##any" minOccurs="0" maxOccurs="unbounded"/>

这意味着在实例文档中,我们可插入任何 XML 元素来扩展 BookType 的定义。在此示例中,我们还具有另外两个模式:Publisher.xsd 和 Reviewer.xsd。我们将使用它们来在实例文档中扩展 BookType 的定义。注意,这两个模式是在不同的名称空间中。

BookRev.xml 通过 xsi:schemaLocation 属性与 Book.xsd 和 Reviewer.xsd 两者关联。它告诉您如何使用 reviewer 元素来扩展 BookType 以对书籍提供审核批注。

  • 在 XML 编辑器的“设计”视图中,选择 opensource:reviewer 元素。从弹出菜单中,选择添加子代 -> comment 来对 reviewer 添加 comment 元素。
  • 运行验证 - 此文档是有效的,因为 reviewer 元素符合在 Reviewer.xsd 文件中定义的约束。
BookPub.xml 通过 xsi:schemaLocation 属性与 Book.xsd 和 Publisher.xsd 两者关联。它告诉您如何使用 company 元素来扩展 BookType 以对书籍提供发行者信息。
  • 在 XML 编辑器的“设计”视图中,选择 pub:company 元素。从弹出菜单中,选择除去来除去它。
  • 运行验证 - 此文档是有效的,因为 any 元素是可选的。

使用特定名称空间

specifiedNamespace 目录下面的 Book.xsd 模式具有一个复杂类型 BookTypeBookType 的内容为:title、author、year 和 isbn,然后可选择是否如 any 元素所指示的那样紧跟任何结构良好的、属于名称空间 http://www.wesley.com 的 XML。
   <any namespace="http://www.wesley.com" minOccurs="0" maxOccurs="unbounded"/>

这意味着在实例文档中,只要有任何 XML 元素属于名称空间 http://www.wesley.com,我们可插入它们来扩展 BookType 的定义。在此示例中,Reviewer.xsd 文件属于此名称空间。

Book.xml 通过 xsi:schemaLocation 属性与 Book.xsd 和 Reviewer.xsd 两者关联。它告诉您如何使用 reviewer 元素来扩展 BookType 以对书籍提供审核批注。

对于 Book.xml,在 XML 编辑器的“设计”视图中,选择 rev:reviewer 元素。从弹出菜单中,选择添加子代 -> comment 来对 reviewer 添加一个 comment。运行验证,确信文档是有效的。

从带有 any 元素的模式生成实例

可使用“新建 XML”向导来创建 XML 模式的实例。如果模式包含指定了名称空间 uri 的 any 元素(例如 specifiedNamespace 目录中 Book.xsd 的 BookType),向导会提示您为这些名称空间输入模式位置。

  • 在“导航器”视图中,选择“specifiedNamespace”目录中的 Book.xsd 对象。右键单击 Book.xsd 并选择生成 -> XML 文件来调用“新建 XML”向导。
  • 在向导的第一页将新文件名指定为 Book1.xml。单击下一步
  • 您会注意到“XML 模式信息”组框中的表包含两个名称空间。第一个是对应于 Book.xsd 的名称空间。第二个是由 Book.xsd 中的 any 元素引用的名称空间。
  • 单击完成。会弹出一条消息,警告还没有为“http://www.wesley.com”指定位置。
  • 单击。现在在表中选择“http://www.wesley.com”名称空间并按“编辑”按钮。
  • 单击浏览按钮并从 anyElement/anyNamespace 目录中选取 Publisher.xsd 文件。
  • 您会注意到,为“http://www.wesley.com”生成了一个 company 元素,作为“http://www.ibm.com”名称空间 book 元素的子元素。
“新建 XML”向导提示您输入模式位置,正确生成内容时需要使用它。如果您重复以上步骤,但选择不为“http://www.wesley.com”名称空间输入模式位置,您会注意到生成了一个 ANY-ELEMENT 位置标志符元素而不是生成 company 元素。将要求您修改 ANY-ELEMENT 以包含您期望的元素。

对 XML 文档添加名称空间

XML 编辑器提供了一个方便的机制来对一个 XML 文档添加多个名称空间。手工添加名称空间(即,通过在源代码视图中输入)容易导致错误;输入模式名称空间 URI 时很容易出现拼写错误,并且也容易在模式位置属性的语法上出现错误。提供了一个有用的对话框来帮助您完成此任务。从“大纲”或“设计”视图中,可使用编辑模式信息对话框来帮助您完成此任务。

  • 打开 anyElement/anyNamespace 目录下面的 BookPub.xml 文件。
  • 右键单击一个根元素并选择编辑模式信息菜单项。
  • 单击新建调用对话框来输入新名称空间信息。
  • 单击浏览并找到 anyNamespace 目录下面的 Reviewer.xsd 文件。
  • 请注意,现在三个字段都自动使用来自模式的信息填好了。
  • 单击确定,再次单击确定。您会注意到添加了一个 xmlns:openSource 属性,并且更新了 xsi:schemalocation 属性值。
  • 既然现在已添加了名称空间,您会注意到在您右键单击 pub:company 元素并选择在前面添加在后面添加弹出菜单时,您可从 Reviewer.xsd 名称空间(即 http://www.apache.com)中添加元素了。

发票

Invoice.dtd 文件提供了定义 Invoice.xml 文件内容的规则。它通过 DOCTYPE 声明与 Invoice.xml 相关联。

顺序内容模型

Invoice 元素具有一个类似如下的内容模型:

   <ELEMENT Invoice (Header, Items+)>

这意味着一个 Invoice 元素可以具有一个 Header 元素,后跟多个 Item

在 XML 编辑器的“设计”视图中,选择 Invoice 元素。从弹出菜单中,选择添加子代 -> Item 来对 Invoice 元素添加一个 Item。可重复此步骤来对 Invoice 元素添加尽可能多的 Item

选项内容模型

Date 元素具有一个类似如下的内容模型:

   <ELEMENT Date ((Month, Day, Year) | (Day, Month, Year))>

这意味着一个 Date 的格式可为 Month 后跟 Day、然后跟 Year,或者可为 Day 后跟 Month、然后跟 Year

可在 XML 编辑器的“设计”视图中轻而易举地在这两组之间切换;首先选择 MonthDayYear 这几项元素(在选择它们时按住 Ctrl 键)。然后从弹出菜单中,选择替换为 -> (Day, Month, Year) 来使用第二组来替换它。

枚举属性类型

Item 元素具有一个 discount 属性,其值可设置为 promotionregular。在 XML 编辑器的“设计”视图中,选择 discount 属性。会出现一个组合框,从中您可在这两个值之间进行选择。或者,在源代码视图中,对 discount 属性选择内容辅助以在这两个值之间进行选择。


编辑 PurchaseOrder.xml

PurchaseOrder.xsd 文件提供了定义 PurchaseOrder.xml 文件内容的规则。它通过 xsi:schemaLocation 属性与 PurchaseOrder.xml 文件关联。

出现约束

在 PurchaseOrder.xsd 中,item 元素(在复杂类型 Item 下面)具有可选的 shipDate 元素,并且 minOccurs=0:

   <element name="shipDate" type="date" minOccurs="0"/>

对于 PurchaseOrder.xml,在 XML 编辑器的“设计”视图中,选择 Item 元素下面的第一个 item。从弹出菜单中,选择添加子代 -> shipDate 来对 item 元素添加一个 shipDate。添加了一个值设置为当前日期的 shipDate 元素。注意添加子代弹出菜单现在不再具有 shipDate 选项,因为满足了至多具有一个 shipDate 元素的约束。

如果选择 shipDate 元素并从弹出菜单中选择除去来除去它,则会再次出现添加子代-> shipDate 选项。

枚举元素类型

在 PurchaseOrder.xsd 中,USAddress 复杂类型具有一个元素 state,该元素的类型为简单类型 USState

   <element name="state" type="po:USState"/>

USState 简单类型是从如下带有枚举特征的字符串中派生出来的:

  <simpleType name="USState">
      <restriction base="string">
          <enumeration value="CA"></enumeration>
          <enumeration value="PA"></enumeration>
          <enumeration value="AR"></enumeration>
      </restriction>
  </simpleType>

对于 PurchaseOrder.xml,在 XML 编辑器的“设计”视图中,选择 shipTo 元素下面的 state 文本字段。将出现一个组合框,可在此组合框中选择三个值(CA、PA 和 AR)中的其中一个,这些值取决于 USState 简单类型中的枚举值。

在实例文档中使用派生类型(xsi:type 属性)

ipo.xml 文件告诉您如何将货物发送到英国而将帐单寄到美国地址。在 ipo.xsd 中,billToshipTo 元素都被定义为 Address 类型:

    <element name="shipTo" type="ipo:Address"/>
    <element name="billTo" type="ipo:Address"/>
在 address.xsd 中,两个复杂类型 USAddressUKAddress 扩展了基本类型 Address

实例文档 ipo.xml 通过使用 xsi:type 属性可选择使用 Address 的不同派生项(例如 USAddress)。

在 XML 编辑器的“设计”视图中,选择 shipTo 元素下面的 xsi:type 属性。注意,现在提供一个组合框来选择想要使用的 Address 类型。向导式辅助将基于在此组合框中选择的类型。

使用多个模式和名称空间

此季度报告示例告诉您如何处理来自不同名称空间的多个模式。它在 PurchaseOrder/international 目录下面包含了下列文件:address.xsdipo.xsdreport.xsdreport.xml

随着模式变得更大,为了便于维护、重用和获得更好的可读性,经常需要将其内容分割到几个模式文档中。XML 模式定义了以下两个构造来支持此操作:include 和 import。include 元素将来自被包含模式的定义和声明引入到当前模式中。它要求被包含模式与包含模式处在同一目标名称空间中。import 元素的行为相似,不同的是导入的模式可来自不同的名称空间。

有关 include 和 import 的更多信息,请参阅 XML 模式编辑器联机帮助。


使用替换组

XML 模式允许命名的元素组替换其它元素。Catalogue.xsd 文件声明 BookMagazine 处在 Publication 的替换组中:

    <element name="Book" type="Catalogue:BookType" 
substitutionGroup="Catalogue:Publication"/>    <element name="Magazine" type="Catalogue:MagazineType" substitutionGroup="Catalogue:Publication"/>
Catalogue 的内容可为替换组中的任何元素。在 XML 编辑器的“设计”视图中,对 Catalogue 元素选择“添加子代”菜单。注意 BookMagazine 都可替换 Publication 元素的内容。另外,已将 Publication 元素声明为 abstract,以避免在实例文档中直接使用 Publication 元素。