Schema中的xsd:any和xsd:anyAttribute

来源:互联网 发布:anaconda3 linux 安装 编辑:程序博客网 时间:2024/04/28 00:43
 <any> 元素使我们有能力通过未被 schema 规定的元素来拓展 XML 文档!
<any> 元素
<any> 元素使我们有能力通过未被 schema 规定的元素来拓展 XML 文档!

下面这个例子是从名为 "family.xsd" 的 XML schema 中引用的片段。它展示了一个针对 "person" 元素的声明。通过使用 <any> 元素,我们可以通过任何元素(在 <lastname> 之后)扩展 "person" 的内容:

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
      <xs:any minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>现在,我们希望使用 "children" 元素来扩展 "person" 元素。这此种情况下我们就可以这么做,即使以上这个 schema 的作者没有声明任何 "children" 元素。

请看这个 schema 文件,名为 "children.xsd":

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

<xs:element name="children">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="childname" type="xs:string"
      maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

</xs:schema>下面这个 XML 文件(名为 "Myfamily.xml"),使用了来自两个不同的 schema 中的成分,"family.xsd" 和 "children.xsd":

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

<persons xmlns="http://www.microsoft.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:SchemaLocation="http://www.microsoft.com family.xsd
http://www.w3school.com.cn children.xsd">

<person>
<firstname>David</firstname>
<lastname>Smith</lastname>
<children>
  <childname>mike</childname>
</children>
</person>

<person>
<firstname>Tony</firstname>
<lastname>Smith</lastname>
</person>

</persons>上面这个 XML 文件是有效的,这是由于 schema "family.xsd" 允许我们通过在 "lastname" 元素后的可选元素来扩展 "person" 元素。

<any> 和 <anyAttribute> 均可用于制作可扩展的文档!它们使文档有能力包含未在主 XML schema 中声明过的附加元素。



内容模型可以对在XML文档内使用的元素、属性和类型进行限制,确定用户可以在XML实例的哪些等级添加自己的元素和属性。
any
  当在XML中声明元素时any是默认的内容模型,该模型可以包含文本、元素和空格。如果允许添加元素的内容,且无需屋里修改模式文件,就可以使用该模型。
例如:
<xsd:xchema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
<xsd:element name=”name”
>
<xsd:complexType>

<xsd:sequence>

<xsd:element name=”first” type=”xsd:string” />
<xsd:element name=”middle” type=”OtherNames”
 />
<xsd:element name=”last” type=”xsd:string”
 />
</xsd:sequence>
</xsd:complexType>

</xsd:element>
<xsd:complexType name=
”OtherNames”>

<xsd:sequence>

<xsd:any namespace=”##any” processContents=”lax” minOccurs=”0” maxOccurs=”unbounded” />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
例子中的xsd:any元素说明该类型允许添加内容。namespace属性允许的值为:

##any(元素可以来自任何命名空间)
##other(元素可以来自除了该元素的父元素所在的目标命名空间之外的命名空间)
##local(元素不受命名空间的限制)
##targetNamespace(元素来自父元素的目标命名空间)
processContents属性说明对这里所创建的元素进行验证时所执行的操作,取值有如下3种:
  strict(标明XML处理器必须获得和那些命名空间相关联的模式,并验证元素和属性)
  lax(与strict相似,只是如果处理器找不到模式文档,也不会出现错误)
  skip(不利用模式文档验证XML文档)
上述模式的一个有效实例如下:
<?xml version=”1.0”?>
<name>
  
<first>santld</first>
  
<middle>
<nameInChina>San</nameInChina>
  
</middle>
  
<last>wang</last>
</name>


0 0
原创粉丝点击