高级概念:使用 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 以对书籍提供审核批注。

BookPub.xml 通过 xsi:schemaLocation 属性与 Book.xsd 和 Publisher.xsd 两者关联。它告诉您如何使用 company 元素来扩展 BookType 以对书籍提供发行者信息。

使用特定名称空间

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),向导会提示您为这些名称空间输入模式位置。

“新建 XML”向导提示您输入模式位置,正确生成内容时需要使用它。如果您重复以上步骤,但选择不为“http://www.wesley.com”名称空间输入模式位置,您会注意到生成了一个 ANY-ELEMENT 位置标志符元素而不是生成 company 元素。将要求您修改 ANY-ELEMENT 以包含您期望的元素。


对 XML 文档添加名称空间

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