2007-04-27
xml schema中unique无法识别默认命名空间的问题
今天在写schema的时候,遇到一个问题如下
例如schema文件代码:
这里对elementOne元素的elementOneKey属性设置了唯一性,在测试过程中,首先用以下XML代码进行测试:
因为elementOneKey的取值重复,验证报错,这个XML是通过本地文件直接指定schema的,并没有使用命名空间,为了使用命名空间指定,将两个文件的改为如下:
schema
XML:
按照schema的约定,该XML验证时将会出错,然而事实上却并没有如期报错,正常保存,为了这个问题我简直抓破脑袋,后来终于搞清楚原因了,就是因为xpath1.0不认识默认名称空间,它会把默认名称空间的元素当作无名称空间元素,默认名称空间元素根本无法被正确识别,所以需要明确的加前缀。
因此我就把schema改成:
将默认命名空间改成前缀为tst,然后xpath指向".//tst:elementOne",接着就搞定,验证正常,希望本文对遇到同一问题的朋友能有所帮助吧。
例如schema文件代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:element name="rootElement">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="elementOne" maxOccurs="unbounded">
<xsd:complexType>
<xsd:attribute name="elementOneKey" type="xsd:integer"/>
<xsd:attribute name="elementOneDesc" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:unique name="EOneKeyU">
<xsd:selector xpath=".//elementOne"/>
<xsd:field xpath="@elementOneKey"/>
</xsd:unique>
</xsd:element>
</xsd:schema>
这里对elementOne元素的elementOneKey属性设置了唯一性,在测试过程中,首先用以下XML代码进行测试:
<?xml version="1.0" encoding="UTF-8"?> <rootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema.xsd"> <elementOne elementOneKey="1" elementOneDesc="a"/> <elementOne elementOneKey="1" elementOneDesc="b"/> </rootElement>
因为elementOneKey的取值重复,验证报错,这个XML是通过本地文件直接指定schema的,并没有使用命名空间,为了使用命名空间指定,将两个文件的改为如下:
schema
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.uniquetest.com/uniquetest"
targetNamespace="http://www.uniquetest.com/uniquetest"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:element name="rootElement">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="elementOne" maxOccurs="unbounded">
<xsd:complexType>
<xsd:attribute name="elementOneKey" type="xsd:integer"/>
<xsd:attribute name="elementOneDesc" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:unique name="EOneKeyU">
<xsd:selector xpath=".//elementOne"/>
<xsd:field xpath="@elementOneKey"/>
</xsd:unique>
</xsd:element>
</xsd:schema>
XML:
<?xml version="1.0" encoding="UTF-8"?> <rootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.uniquetest.com/uniquetest" xsi:schemaLocation="http://www.uniquetest.com/uniquetest schema.xsd"> <elementOne elementOneKey="1" elementOneDesc="a"/> <elementOne elementOneKey="1" elementOneDesc="b"/> </rootElement>
按照schema的约定,该XML验证时将会出错,然而事实上却并没有如期报错,正常保存,为了这个问题我简直抓破脑袋,后来终于搞清楚原因了,就是因为xpath1.0不认识默认名称空间,它会把默认名称空间的元素当作无名称空间元素,默认名称空间元素根本无法被正确识别,所以需要明确的加前缀。
因此我就把schema改成:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tst="http://www.uniquetest.com/uniquetest"
targetNamespace="http://www.uniquetest.com/uniquetest"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:element name="rootElement">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="elementOne" maxOccurs="unbounded">
<xsd:complexType>
<xsd:attribute name="elementOneKey" type="xsd:integer"/>
<xsd:attribute name="elementOneDesc" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:unique name="EOneKeyU">
<xsd:selector xpath=".//tst:elementOne"/>
<xsd:field xpath="@elementOneKey"/>
</xsd:unique>
</xsd:element>
</xsd:schema>
将默认命名空间改成前缀为tst,然后xpath指向".//tst:elementOne",接着就搞定,验证正常,希望本文对遇到同一问题的朋友能有所帮助吧。
- 浏览: 116786 次
- 性别:

- 来自: 珠海

- 详细资料
搜索本博客
我的相册
1
共 9 张
共 9 张
最新评论
-
使用java实现http多线程下 ...
...版式有问题, 希望能耐心的看看,谢谢了哈
-- by 落花虽有意 -
使用java实现http多线程下 ...
看了你的思路我也写了个简单的,中间出了点问题想请教您,谢谢了``` 问题是这样 ...
-- by 落花虽有意 -
Python笔记之and or陷阱
Python 2.5中可以用 value1 if expression else ...
-- by victorsos -
使用java实现http多线程下 ...
不错,谢谢,学习一下!
-- by nighty -
记张学友演唱会让我愤怒的 ...
保安的行为有抢劫的嫌疑
-- by JavaInActoin






评论排行榜