浏览 3491 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-04-27
例如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",接着就搞定,验证正常,希望本文对遇到同一问题的朋友能有所帮助吧。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-05-12
|
|
返回顶楼 | |