`
xinklabi
  • 浏览: 1591777 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

Schema中elementFormDefault="qualified"所起的作用

阅读更多

有的xsd文件的开头是这样写的:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.abc.com"
           xmlns:ps="http://www.abc.com"
           elementFormDefault="qualified">

可是去掉elementFormDefault="qualified"好象也没什么影响呀?

 

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

一个schema中声明的元素或者类型只能归到两个命名空间中的某一个去,这两个是,无名命名空间和由targetSchema属性指明的目标命名空间。而targetSchema属性只能在xs:schema的定义中声明,因而,一个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="aaaa unqualified.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="aaaa qualified.xsd">
 <c1> 3.141593E0</c1>
 <c2> String</c2>
</c>

3. 定义了目标命名空间, 全局elementFormDefault=“unqualified”。这时全局元素(c)或者类型将归于目标命名空间。局部元素(c1,c2)以缺省方式归于无名命名空间。局部元素(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="aaaa qualified2.xsd">
 <c1> 3.141593E0</c1>
 <c2> String</c2>
 <n:c3> 0</n:c3>
</n:c>

 

相信使用过这个属性的朋友大都会被这个属性搞得比较迷惑,使用过程中经常会莫名其妙的校验报错,对照文档解释,觉得没什么错啊,如果换一种写法或者设置又可以了,但是就是说不清为什么。

关于这个属性官方文档上的语焉不详,网上网友就这个属性讨论也是各有各的看法,莫衷一是。网上比较典型的一个讨论帖子是:请问SchemaelementFormDefault="qualified"是起什么作用呀?(http://www.xml.org.cn/dispbbs.asp?BoardID=23&id=25672&replyID=17053&star=1&skin=0

以下是在做了许多试验,对照MSDN上的说法,参照网友的讨论得出的看法

 

先看MSDNelementFormDefault 属性的解释:

在该架构的目标命名空间中声明的元素的形式。该值必须是下列字符串之一:qualified unqualified。默认值为 unqualified

如果该值是 unqualified,则无须通过命名空间前缀限定目标命名空间的元素。

如果该值是 qualified,则必须通过命名空间前缀限定目标命名空间的元素。

 

MSDN的描述不完整,完整的应该是:

如果该值是 unqualified,实例xml的根元素必须有命名空间的的限定,这个命名空间必须是schema中定义的targetNameSpace。但是其下子元素无须也不允许用命名空间前缀限定目标命名空间。 子元素的命名空间为空命名空间。

如果该值是 qualified,实例xml根元素及其下所有子元素都必须通过命名空间前缀限定目标命名空间。这个命名空间必须是schema中定义的targetNameSpace

 

再看xml实例中根元素和子元素的命名空间的设置:

1.       通过prefix定义命名空间

在根元素的属性中使用 xmlns:xxx = url 的语法来定义一个名称空间的前缀xxx,然后在需要用这个名称空间限定的元素前面加上前缀和冒号,例如:

<?xml version="1.0" encoding="UTF-8"?>

<n:c xmlns:n="aaaa">

 <n:c1>3.141593E0 </n:c1>

 <n:c2>String</n:c2>

 <c3>0</c3>

</n:c>

这个xml实例中定义了一个叫“aaaa”的前缀,在元素名称前面加了”n:”的元素都会拥有”aaaa”的命名空间,没有加前缀的元素(c3)将没有命名空间的限定,它的命名空间属性为””

2.       通过默认命名空间定义全部元素的命名空间

根元素的单独的xmlns 属性定义一个xml实例的默认命名空间,其下的元素除了另外设置了前缀,都将被默认命名空间限定。例如:

<?xml version="1.0" encoding="UTF-8"?>

<c xmlns ="aaaa">

 <c1>3.141593E0 </c1>

 <c2>String</ c2>

 <c3>0</c3>

</n:c>

这个xml实例中所有元素(c,c1,c2,c3)的命名空间都是“aaaa

 

总结:

elementFormDefault 属性只是用来设置xml的实例中子元素是否一定需要有命名空间限定,不控制xml实例中各元素归属哪个命名空间。xml实例中元素的命名空间由xml实例本身的设置决定。

分享到:
评论

相关推荐

    浅谈XML Schema中的elementFormDefault属性

    当elementFormDefault属性被设置为qualified时,表示所有的局部元素(即在当前schema中定义的元素)都必须使用限定名(qualified name,简称QName),也就是前面要加上命名空间的前缀。这种方式的优势在于它可以避免...

    对XML字段进行约束 SQL server 2005

    在SQL Server 2005中,为了确保存储在数据库中的XML数据的完整性与一致性,可以使用XML Schema来对XML字段进行约束。本篇将详细解释如何创建支持XML Schema约束的表、定义XML Schema以及如何在SQL Server 2005中使用...

    java中实现xmlschema验证文件借鉴.pdf

    8. **Qualified Elements**: 在XSD中,`elementFormDefault="qualified"`意味着所有元素都应该有命名空间前缀,就像XML文档中的`my:students`, `my:student`, `my:name` 和 `my:age`。 9. **Data Types**: XSD支持...

    schema学习笔记

    - **骆驼式命名法**:在Schema中,大多数关键字采用了骆驼式命名法,即由一个或多个单词组成,第一个单词首字母小写,后续每个单词首字母大写。例如,`elementName`。 #### 数据类型 - **String**:最基本的文本...

    理解XML Schema XML Schema进阶

    XML Schema中命名空间的使用是非常重要的,命名空间可以使我们能够从不同的词汇表中区分定义以及声明。目标命名空间使我们能够区分在XML Schema语言词汇表中的元素声明和在一个其他的假定的化学语言词汇表中的元素...

    XML_SCHEMA教程

    XML_SCHEMA教程详解 XML Schema,简称XSD,是W3C...XML Schema是XML开发中的重要工具,对于保证XML数据的准确性和一致性有着不可或缺的作用。理解和掌握XML Schema,有助于开发者创建出更加健壮和可靠的XML应用程序。

    Java通过XML Schema校验XML

    elementFormDefault="qualified"&gt; &lt;xs:element name="note"&gt; &lt;xs:element name="to" type="xs:string"/&gt; &lt;xs:element name="from" type="xs:string"/&gt; &lt;xs:element name="heading" type="xs:string"/&gt; ...

    XML学习 练习SCHEMA

    7. **模式继承与约束**:通过使用`elementFormDefault`和`attributeFormDefault`,可以控制元素和属性是否默认为限定(qualified)状态,即是否需要携带命名空间前缀。 8. **组与模式片段**:可以创建元素或属性的...

    XML schema教程

    elementFormDefault="qualified"&gt; &lt;xs:element name="note"&gt; &lt;xs:element name="to" type="xs:string"/&gt; &lt;xs:element name="from" type="xs:string"/&gt; &lt;xs:element name="heading" type="xs:string"/&gt; ...

    spring自定义标签

    elementFormDefault="qualified"&gt; &lt;xs:element name="myCustomTag" type="myCustomTagType"/&gt; &lt;xs:complexType name="myCustomTagType"&gt; &lt;xs:attribute name="attr1" type="xs:string" use="required"/&gt; ...

    XML应用开发(软件品牌)-1期 3.12 案例分析-限定目标命名空间.doc

    在XML Schema中,`elementFormDefault`和`attributeFormDefault`属性用于控制元素和属性是否需要限定在目标命名空间内。当`elementFormDefault`为`unqualified`时,全局声明的元素不会自动包含在目标命名空间内,而...

    第一次实验1

    elementFormDefault="qualified"&gt; &lt;xs:element name="school"&gt; &lt;xs:element name="grade"&gt; &lt;xs:element name="class"&gt; &lt;xs:element name="student"&gt; &lt;xs:element name="studentId" type="xs:...

    spring 自定义xsd

    elementFormDefault="qualified"&gt; &lt;xs:element name="myBean"&gt; &lt;xs:attribute name="customName" type="xs:string" use="required"/&gt; &lt;xs:attribute name="customProperty" type="xs:string"/&gt; &lt;/xs:...

    WEB服务描述语言.docx

    &lt;s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/"&gt; &lt;s:element name="HelloWorld"&gt; &lt;s:element name="HelloWorldResponse"&gt; &lt;s:element minOccurs="0" maxOccurs="1" name=...

    XML文档.doc

    通过使用`elementFormDefault="qualified"`和`attributeFormDefault="unqualified"`,Schema指定了元素和属性的默认形式。这有助于确保XML数据的一致性和正确性,是现代XML应用中的重要组成部分。 ### 结论 通过对...

    .NET Framework中的XML序列化

    &lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:xmlns:25hoursaday-com:my-bookshelf" xmlns:bk="urn:xmlns:25hoursaday-com:my-bookshelf" elementFormDefault="qualified"&gt; ...

    JAXB Demo及namespace的prefix自定义解决方案

    @XmlSchema(namespace = "http://example.com/schema", elementFormDefault = XmlNsForm.QUALIFIED, namespacePrefixMapper = MyNamespacePrefixMapper.class) @XmlJavaTypeAdapters({...}) // 如果有类型适配器的话...

    利用java反射模拟struts2工作.doc

    &lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.myblogs.org" elementFormDefault="qualified" targetNamespace="http://www.myblogs.org"&gt; &lt;!-- 元素定义 --&gt; ... ... ...

Global site tag (gtag.js) - Google Analytics