以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 DTD/XML Schema 』 (http://bbs.xml.org.cn/list.asp?boardid=23) ---- 请问Schema中elementFormDefault="qualified"是起什么作用呀? (http://bbs.xml.org.cn/dispbbs.asp?boardid=23&rootid=&id=25672) |
-- 作者:sasami808 -- 发布时间:12/20/2005 9:40:00 AM -- 请问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"好象也没什么影响呀? |
-- 作者:vampire_shirley -- 发布时间:12/20/2005 4:19:00 PM -- 同问 |
-- 作者:flashjean -- 发布时间:12/20/2005 5:09:00 PM -- 应该是对一些 格式的限制和规范。 qualified 表示需要限制 |
-- 作者:98900969r -- 发布时间:12/20/2005 6:26:00 PM -- 一个 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"?> unqualified.xml <?xml version="1.0" encoding="UTF-8"?> 2. 定义了目标命名空间, 全局elementFormDefault=“qualified”。这时全局元素或者类型将归于目标命名空间,局部元素将以缺省方式归于目标命名空间。 qualified.xsd <?xml version="1.0" encoding="UTF-8"?> qualified.xml <?xml version="1.0" encoding="UTF-8"?> 3. 定义了目标命名空间, 全局elementFormDefault=“unqualified”。这时全局元素(c)或者类型将归于目标命名空间。局部元素(c1,c2)以缺省方式归于无名命名空间。局部元素(c3)在局部定义中使用form=“qualified”覆盖全局设定的unqualified,这使得c3归于目标命名空间(如果它有子元素,子元素将以缺省方式归于目标命名空间)。 qualified2.xsd <?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
[此贴子已经被作者于2005-12-21 0:57:51编辑过]
|
-- 作者:flashjean -- 发布时间:12/21/2005 10:05:00 AM -- 麻烦解释一下 elementFormDefault="unqualified" 时候,全局元素(c)或者类型将归于目标命名空间。 问题是: 为什么就一定 <n:c ,有n 作为前缀, 为什么是 n 不是别的字母? |
-- 作者:98900969r -- 发布时间:12/21/2005 1:06:00 PM -- 并不是非要是n,随便什么都行,一长串也行。 |
-- 作者:flyfoxs -- 发布时间:12/25/2005 7:57:00 PM -- 当elementFormDefault="qualified" 时,所有全局元素的子元素将被以缺省方式放到目标命名空间,但是全局元素或者类型将被放到目标命名空间; [此贴子已经被作者于2005-12-25 20:30:34编辑过]
|
-- 作者:98900969r -- 发布时间:12/26/2005 12:49:00 AM -- 那句话是有问题,谢谢你指出来!我后来发现了想改,可是已经过了可编辑的时间了。那句话应该是: 当elementFormDefault="qualified" 时,所有全局元素的子元素将被以缺省方式放到目标命名空间,连同全局元素或者类型一起;
|
-- 作者:flyfoxs -- 发布时间:12/31/2005 6:33:00 PM -- 在你的例子中,第一个例子与第二个例子中被验证的文件好像是一样的! 那么XSD在这里面有什么作用,只是验证的话,对应 的两个 XSD好像 不一样啊? 当elementFormDefault="qualified" 时,所有全局元素的子元素将被以缺省方式放到目标命名空间,连同全局元素或者类型一起; [此贴子已经被作者于2005-12-31 19:09:48编辑过]
|
-- 作者:98900969r -- 发布时间:1/2/2006 5:29:00 AM -- 三个例子都不一样。就第一个和第二个而言,如果不顾及命名空间,它们真的一样,但是必须要考虑命名空间。第一个中,只有c归于命名空间“aaaa”,c1和c2属于无名命名空间。而第二个中,c,c1和c2全部属于命名空间“aaaa”。 |
-- 作者:victorwish -- 发布时间:1/5/2006 11:23:00 AM -- 好晕哦。看不懂 |
-- 作者:nocake -- 发布时间:1/5/2006 7:33:00 PM -- 好文章,谢谢 |
-- 作者:flyfoxs -- 发布时间:1/6/2006 11:18:00 AM -- 这一个帖子至少看了20次以上了.只能说是越来越明白. targetnamespace是来限定schema中出现的元素和属性的名称空间. 中文英文相关的都看了不少,总是对这个帖子体会不到位!!!!!
[此贴子已经被作者于2006-1-6 19:10:53编辑过]
|
-- 作者:98900969r -- 发布时间:1/6/2006 7:10:00 PM -- 动手试比光看要管用。 |
-- 作者:flyfoxs -- 发布时间:1/6/2006 7:15:00 PM --
我就是试了之后才体会到上面两点的! 我是这样试的 1)把下面qualified全修改为unqualified,没有什么反应. <schema xmlns="http://www.w3.org/2001/XMLSchema" <element name="purchaseOrder" type="po:PurchaseOrderType"/> <complexType name="PurchaseOrderType"> <complexType name="USAddress"> <!-- etc. --> </schema>
|
-- 作者:98900969r -- 发布时间:1/6/2006 7:37:00 PM -- 在schema里面是没有反应,有反应的是它所说明的xml实例文档。 |
-- 作者:flyfoxs -- 发布时间:1/7/2006 9:09:00 PM -- 2)把schema子元素的po:前缀删了,这个文档还是有效的.
|
-- 作者:98900969r -- 发布时间:1/7/2006 10:55:00 PM -- 如果你把schema中元素声明中type属性值中的po:删掉,那这个schema本身就错了。例如,如果把: <element name="purchaseOrder" type="po:PurchaseOrderType"/> 改成: <element name="purchaseOrder" type="PurchaseOrderType"/> 那这个schema本身就不对了,因为找不到PurchaseOrderType这个类型。这是因为,这时type="PurchaseOrderType"中PurchaseOrderType类型前缀为空,验证它的程序就认为它属于缺省命名空间,而此时缺省命名空间是"http://www.w3.org/2001/XMLSchema"(由xmlns="http://www.w3.org/2001/XMLSchema"声明),但是这个命名空间里面没有PurchaseOrderType这个类型,所以出错。 |
-- 作者:flyfoxs -- 发布时间:1/8/2006 10:23:00 AM -- 明白了!这回这个帖子估记明白了80%了. 谢谢! |
-- 作者:zoomaxed -- 发布时间:1/22/2006 4:47:00 AM -- 98900969r作了很扎实的描述,尤其是这三个基本例子和颜色说明。解决了我好多困扰。非常谢谢分享!!! 我还有个疑问,就是为什么要制定这个ElementDefaultForm?背后有什么故事吗?到底它的目的是什么哪?换句话说:如果我们把它去掉,难道会有一些schema功能不能实现吗? 先总结一下我的学习感受,主要是澄清了三个错误观念: 第一: 我以前有个错误的概念,就是认为qualified就是说这个schema必须要去validate所有全局元素和子元素,相反,unqualified就是只是去validate全局元素,而局部元素可以不去理它。通过实验98900969r的unqualified.xml例子,我的观点是错误的。 比如说,我改变了unqualified.xml的一些元素的值to: <c1>try a string here</c1> <?xml version="1.0" encoding="UTF-8"?> 我在XMLSpy中validate这个xml实例,结果failed,因为c1的type被改变了。 正确的观点是,ElementDefaultForm跟怎样定义、验证具体的元素,属性等没有直接关系。它只是限定在哪个namespace空间去执行这些操作。 第二: 这个错误观念,我是从另一篇文章里得到的。那篇文章说,elementFormDefault用来定义实例化后的XML文档中,属性名称的前面是否需要加名称空间前缀,如果elementFormDefault="qualified",那么XML的属性名称前面就需要加前缀。(我觉得他是讲元素名称,而不是属性名称)。这种想法好像很危险。还是举98900969r的qualified.xml例子说明: 原稿qualified.xml: 很显然,这里根本就没有什么prefix。这是我的第二个错误观念。 当然,我们也可以加上prefix,修改成, 或者, 他们都是有效的实例。 第三:关于子元素继承父元素的命名空间的问题。我以前认为,如果子元素没有prefix,那么它就应该存在于在父元素的命名空间。<---错! 原稿unqualified.xml: 这里c1 c2 实际上是在null namespace,而不是在n命名空间<---正确! 更进一步,我们想象如果这个实例中有default namespace会怎样哪? <?xml version="1.0" encoding="UTF-8"?> 这里,我把c元素放在default namespace(aaaa)。注意,子元素c1 c2必须放在未命名空间""中。这个修改的实例可以通过validation。但是,如果我们拿掉c1 c2中的xmlns="",验证就立即失败:“c1 c2 没有定义“。 所以,关于继承父元素命名空间的正确观点应该是:只有在父元素中的default namespace才可以以继承。 也可以通俗地认为,命名空间根本就不能继承。但是,如果假设我们有个叫作ANYELEMNT节点定义了缺省命名空间,那么属于这个节点的所有子元素中,那些没有前缀的元素就属于这个ANYELEMNT定义的缺省命名空间(所谓的继承);如果追溯到整个文件的根,还没有找到缺省的命名空间的话,那这个没有带前缀的元素就属于无名命名空间了。带prefix的父元素,其命名空间不能传递给子元素。 举例说明一下: <?xml version="1.0" encoding="UTF-8"?> xmlns:myNamespace="aaaa" <xs:element name="root"> <ANYELEMNT xmlns="aaaa"> 这里,ACHILD元素继承了父元素ANYELEMNT的缺省命名空间(xmlns="aaaa")。schema验证是成功的。 最后,我还是想重复一下我的问题:在schema中,为什么要有这个elementFormDefault?看了98900969r的介绍,我似乎明白它的规则了。但究竟为什么要制定这个规则呢? 请各位指教。 谢谢!!如果能给我发email最好。 zoomaxed@yahoo.com
|
-- 作者:daizemiao2006 -- 发布时间:2/20/2006 11:18:00 AM -- 请问所提出问题中的xmlns:xs="http://www.w3.org/2001/XMLSchema"代表未命名空间,那么xmlns:ps="http://www.abc.com"代表什么空间呢?为什么前一个就可以代表未命名空间而后一个不可以呢? |
-- 作者:wFirebird -- 发布时间:3/9/2006 3:30:00 PM -- 受益匪浅~! 顶一下 |
-- 作者:wFirebird -- 发布时间:3/14/2006 10:36:00 AM -- <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns1="aaaa" 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> <?xml version="1.0" encoding="UTF-8"?> |
-- 作者:wFirebird -- 发布时间:3/14/2006 10:41:00 AM -- 似乎是,如果在Schema定义中使用了 elementFormDefault=“false”那么在XML文件里面就不允许出现默认的名称空间,只有elementFormDefault=“true”时在XML文件中才能使用空的名称空间(默认名称空间)。 |
-- 作者:wFirebird -- 发布时间:3/14/2006 10:44:00 AM -- 嘿嘿 写错了 elementFormDefault="unqualified"就是指XML文件没有资格使用默认名称空间。 elementFormDefault="qualified"就是指XML文件有资格使用默认名称空间。 嘎嘎~ |
-- 作者:メ冰枫ぱ雪 -- 发布时间:3/23/2006 6:40:00 AM -- 我记得是完全符合w3c标准哦。 前面加个un是不完全符合。 |
-- 作者:krazy -- 发布时间:3/31/2006 5:35:00 PM -- 解释的很确切 解决了我的盲区,谢谢 |
-- 作者:skyo -- 发布时间:4/6/2006 11:20:00 PM -- 顶 看了明白很多了~ |
-- 作者:kelindun -- 发布时间:5/5/2006 9:15:00 AM -- 好帖子,我是认认真真看了2遍的,获益匪浅! |
-- 作者:kelindun -- 发布时间:5/5/2006 9:48:00 AM -- 说下我的理解吧。其实简单的想来,98900969r说的很清楚了。只要看他做的红色和蓝色标记,应该就可以明白了。第一个例子中,elementFormDefault=unqualified ,所以全局元素c归于目标名域空间。 以此类推....elementFromDefault 与attributeFormDefault针对的是元素与属性归属于目标名域空间和默认空间的问题。unqualified时,除全局元素和类型,其余的都归于默认名域空间。qualified时,归属与目标名域空间。 元素覆盖(例3中的 form属性)比较简单,大家很好理解 |
-- 作者:flyfoxs -- 发布时间:6/9/2006 11:06:00 AM -- 跨越了几个月,终于明白了这个帖子所说的语法。 可是不明白,这样制定的语法,有什么作用? |
-- 作者:98900969r -- 发布时间:6/9/2006 4:37:00 PM -- Henry S. Thompson(XML Schema 的编委之一,供职于爱丁堡大学教授)在这里 http://lists.xml.org/archives/xml-dev/200007/msg00064.html 回答了对于 elementFormDefault 的作用质疑。依我的理解,可以简单认为 elementFormDefault 的存在是为了方便,并不是必需。 此外,XML Schema的复杂性引起了很多争议。其中一部分的复杂性就来自这些可有可无的东西,它们带来方便,也带来麻烦。
|
-- 作者:wyguanshui -- 发布时间:6/15/2006 12:33:00 PM -- 顶 |
-- 作者:chnking -- 发布时间:7/12/2006 2:25:00 PM -- 看了几遍帖子,感觉说得都有些问题,下面是我的理解 先看MSDN中elementFormDefault 属性的解释: MSDN的描述不完整,完整的应该是: 再看xml实例中根元素和子元素的命名空间的设置: 总结: |
-- 作者:gyz5656 -- 发布时间:9/6/2006 7:14:00 PM -- 麻烦问一下,schema 在开发中的作用是什么?我从数据库中倒出的数据如何进行验证呢? |
-- 作者:iamlinzi -- 发布时间:9/11/2006 4:53:00 PM -- 看了98900969r的解释,感觉和我理解的有所不同。 为此我特意看了http://www.w3.org/TR/xmlschema-0/上的文章,这是schema的官方规范。 首先,targetNamespace属性规定了本schema词汇表的名字空间。 第二,无论是全局element/attribute,还是本地的,都属于这个名字空间。 第三,elementFormDefault/attributeFormDefault都只影响schema instance document中本地 |
-- 作者:iamlinzi -- 发布时间:9/11/2006 5:01:00 PM -- 看了98900969r的解释,感觉和我理解的有所不同。 为此我特意看了http://www.w3.org/TR/xmlschema-0/上的文章,这是schema的官方规范。 首先,targetNamespace属性规定了本schema词汇表的名字空间。 第二,无论是全局element/attribute,还是本地的,都属于这个名字空间。 第三,elementFormDefault/attributeFormDefault都只影响schema instance document中本地 element/attribute是否使用前缀,没有其他作用。 第四,98900969r的未命名空间,我的理解应该是没有名字空间。按照官方说明,在schema没有指定targetNamespace、并且instance document没有引入名字空间时,此时element/attribute都没有名字空间。 在此,我有点想法,有些东西单纯靠尝试是不行的,应该从本质上理解这些概念。最好的办法就是看官方的文档。 |
-- 作者:yjclose2006 -- 发布时间:9/28/2006 4:30:00 PM -- 98900969r的解释我完全看懂了,而且分析也颇有道理,但在具体应用中我不能理解按照98900969r的解释有什么作用。但是看了iamlinzi的解释,据说来自官方网站的解释,我相信iamlinzi的英文阅读能力,似乎这种解释对于elementFormDefault在schema的应用更加明确,让我想起了一些开发语言中对变量是否强行定制的设置。但如果是iamlinzi的解释是正确的话,那么98900969r的示例中当elementFormDefault=qulified的时候,如果舍掉了前缀势必没法通过spy2006的验证。如此又则怎么解答呢? |
-- 作者:gogy -- 发布时间:10/26/2006 5:49:00 PM -- 我的看法是:98900969r是按照书上的说法来的,但并未说到点子上,究竟这样限制来限制去的,是为了干什么,有什么用?我认同chnking 的说法,名称空间只是用来区分相同名称元素的,”无论是全局element/attribute,还是本地的,都属于这个名字空间“。 例如:qualified时, <?xml version="1.0" encoding="UTF-8"?> <n:c xmlns ="aaaa"> <c1>3.141593E0 </c1> <c2>String</ c2> <c3>0</c3> </n:c> 说C1,C2,C3属于未命名名称空间有什么意义啊,我们的目的是验证这三个元素有没有效,不是还得按照unqualified.xsd来验证啊。 所以我觉得,elementFormDefault不过是用来决定,要不要加前缀的。 |
-- 作者:chyzw -- 发布时间:11/5/2006 12:03:00 AM -- 太好 了。。我正在想这个呢。。Thank you! |
-- 作者:snowbeer -- 发布时间:12/10/2006 3:41:00 PM -- 作个记号,回去好好想想 |
-- 作者:zhy_justin -- 发布时间:3/16/2007 5:01:00 PM -- ding |
-- 作者:ljx004201 -- 发布时间:4/13/2007 3:47:00 PM -- schemaLocation那这个的作用呢怎么还要加xsi,以及前边还要定义一个命名空间呢 |
-- 作者:lao_cai -- 发布时间:5/11/2007 11:23:00 AM -- 以下XML文档中c c1 c2 c3是属于哪个命名空间?到底是aaaa还是dddd? <?xml version="1.0" encoding="UTF-8"?> <c xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="aaaa 4-qualified.xsd" xmlns="dddd"> <c1>3.141593E0</c1> <c2>String</c2> <c3>0</c3> </c> 对应的schema <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="aaaa" elementFormDefault="qualified" > <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" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
|
-- 作者:gogy -- 发布时间:5/12/2007 10:36:00 PM -- 当然属于dddd,但是,这样能验证吗? |
-- 作者:edisonviva2006 -- 发布时间:5/24/2007 11:42:00 AM -- up up up |
-- 作者:insky -- 发布时间:7/11/2007 5:06:00 PM -- 学习了 谢啦`~~~ |
-- 作者:iaiyanghua1 -- 发布时间:4/11/2008 10:56:00 AM -- 我刚开始 学习 XML 晕了 ,,,,,,,,,,,,,,,,,,, |
-- 作者:1500053 -- 发布时间:5/10/2008 9:13:00 PM -- 3Q |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
296.875ms |