xmlSchema

前端之家收集整理的这篇文章主要介绍了xmlSchema前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

花了两天的时间看了一下xmlSchema的内容,感觉有了dtd的基础之后学习schema不是什么难事,比较纠结的地方是搞懂schema中命名空间的真正涵义。

以下全是本人的一些拙陋的理解,我不想用一些看起来很专业的术语,还是用最平实的大白话记述一下自己的理解。

众所周知,xmlSchema文件(.xsd)是对xml文件(.xml)的定义,说白了就是对xml文件的一种约束。

比如cehongfu.xml文件的一个约束文件时cehkongfu.xsd

cehkongfu.xsd

<?xmlversion="1.0"?>

<xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"

targetNamespace="cehkongfu"

xmlns="cehkongfu"

elementFormDefault="qualified">

<!--目标名称空间包含非全局的元素定义 -->

<xs:elementname="note">

<xs:complexType>

<xs:sequence>

<xs:elementname="to" type="xs:string"/>

<xs:elementname="from" type="xs:string"/>

<xs:elementname="heading" type="xs:string"/>

<xs:elementname="body" type="xs:string"/>

<xs:elementname="sendDate" type="xs:date"/>

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:schema>

cehkongfu.xml

<?xmlversion="1.0"?>

<note

xmlns="cehkongfu"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="cehkongfucehkongfu.xsd">

<to>cmy</to>

<from>ceh</from>

<heading>Remingder</heading>

<body>Don'tforget me this weekend!</body>

<sendDate>2014-02-10</sendDate>

</note>


下面写一下作者花了大量时间搞懂的一个问题:
schema文件中elementFormDefault的作用

一个 XML schema elementFormDefault=""这一属性用来指示 XML Schema处理程序把这个 XML schema中定义的元素或者类型放到哪个命名空间。

一个schema中声明的元素或者类型只能归到两个命名空间中的某一个去,这两个是,无名命名空间和由targetSchema属性指明的目标命名空间。而targetSchema属性只能在xsschema的定义中声明,因而,一个schema中的定义的元素或类型只可能归属于一个有名命名空间(但是还有可能归属于无名命名空间)。

elementFormDefault="qualified"时,所有全局元素的子元素将被以缺省方式放到目标命名空间,但是全局元素或者类型将被放到目标命名空间;而当elementFormDefault="unqualified"时,所有全局元素的子元素将被以缺省方式放到无名命名空间。而属性的命名空间类似地由attributeFormDefault=""来指明。

需要明白的是,elementFormDefault=""是有作用域的,并且是被继承的,除非在子定义中覆盖父定义。

下面三个例子说明了elementFormDefault的使用效果。红色表示属于已命名空间的元素,蓝色表示属于未命名空间的元素。

1.定义了目标命名空间,全局elementFormDefault=“unqualified”。这时除了全局元素或者类型将归于目标命名空间外,局部元素将归于无名命名空间。

unqualified.xsd

<?xml version="1.0"encoding="UTF-8"?>
<xs:schema xmlns:xs="
http://www.w3.org/2001/XMLSchema"targetNamespace="aaaa"elementFormDefault="unqualified"attributeFormDefault="unqualified">
<xs:element name="c">
<xs:complexType>
<xs:sequence>
<xs:element name="c1"type="xs:double"/>
<xs:element name="c2"type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

unqualified.xml

<?xml version="1.0"encoding="UTF-8"?>
<n:c xmlns:n="aaaa"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="aaaaunqualified.xsd">
<c1>3.141593E0</c1>
<c2>String</c2>
</n:c>

2. 定义了目标命名空间,全局elementFormDefault=“qualified”。这时全局元素或者类型将归于目标命名空间,局部元素将以缺省方式归于目标命名空间。

qualified.xsd

<?xml version="1.0"encoding="UTF-8"?>
<xs:schema xmlns:xs="
http://www.w3.org/2001/XMLSchema"targetNamespace="aaaa"elementFormDefault="qualified"attributeFormDefault="unqualified">
<xs:element name="c">
<xs:complexType>
<xs:sequence>
<xs:element name="c1"type="xs:double"/>
<xs:element name="c2"type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

qualified.xml

<?xml version="1.0"encoding="UTF-8"?>
<c xmlns="aaaa"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="aaaaqualified.xsd">
<c1>3.141593E0</c1>
<c2>String</c2>
</c>

3. 定义了目标命名空间,全局elementFormDefault=“unqualified”。这时全局元素(c)或者类型将归于目标命名空间。局部元素(c1c2)以缺省方式归于无名命名空间。局部元素(c3)在局部定义中使用form=“qualified”覆盖全局设定的unqualified,这使得c3归于目标命名空间(如果它有子元素,子元素将以缺省方式归于目标命名空间)。

qualified2.xsd

<?xml version="1.0"encoding="UTF-8"?>
<xs:schema xmlns:xs="
http://www.w3.org/2001/XMLSchema"targetNamespace="aaaa"elementFormDefault="unqualified"attributeFormDefault="unqualified">
<xs:element name="c">
<xs:complexType>
<xs:sequence>
<xs:element name="c1"type="xs:double"/>
<xs:element name="c2" type="xs:string"/>
<xs:element name="c3"type="xs:integer"
form="qualified"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>


qualified2.xml

<?xml version="1.0"encoding="UTF-8"?>
<n:c xmlns:n="aaaa"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="aaaaqualified2.xsd">
<c1>3.141593E0</c1>
<c2>String</c2>
<n:c3>0</n:c3>
</n:c>

猜你在找的XML相关文章