高级概念:使用 any 元素创建可扩展内容模型
此示例告诉您如何使用 XML 模式中的 any 元素来在 XML 文档中创建可扩展内容模型。此示例分为两个目录:
-
anyNamespace - 告诉您如何使用 ##any 名称空间
-
specifiedNamespace - 告诉您如何使用特定名称空间
使用 ##any 名称空间
anyNamespace 目录下面的 Book.xsd 模式具有一个复杂类型 BookType。BookType 的内容为: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 模式具有一个复杂类型 BookType。BookType 的内容为: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)中添加元素了。