`
calmness
  • 浏览: 353291 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

xml schema中unique无法识别默认命名空间的问题

    博客分类:
  • XML
XML 
阅读更多
今天在写schema的时候,遇到一个问题如下
例如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",接着就搞定,验证正常,希望本文对遇到同一问题的朋友能有所帮助吧。
分享到:
评论
1 楼 gogy 2007-05-12  

相关推荐

    理解XML Schema XML Schema进阶

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

    XML Schema教程

    - **XML 以及 XML 命名空间**:熟悉 XML 的基本概念和命名空间的使用。 - **DTD 的基本了解**:尽管 XML Schema 是 DTD 的替代品,但了解 DTD 的基本原理有助于更好地理解 XML Schema 的优势和特点。 通过上述内容...

    根据xml schema生成xml

    例如,`&lt;element&gt;`定义了一个命名的XML节点,可以是文档中的一个节点或子节点;`&lt;attribute&gt;`则用来描述元素的附加信息;数据类型如`string`、`integer`等,用于限制元素或属性的值。 在生成XML文档时,遵循XML ...

    XML与XMLSchema

    - **命名空间**:通过URI来区分不同来源的元素和属性,避免命名冲突。 XML Schema的重要性在于它增强了XML文档的严谨性和一致性,确保了不同系统间数据交换的准确性和可靠性。 XML相关API是指用于操作和处理XML...

    XmlSchema-1.4.7.jar

    5. **命名空间管理**:处理XML文档中的命名空间,使得可以正确解析包含多个命名空间的文档。 与"xfire"标签相关,可能表明这个库常用于与XFire(现已被Apache CXF替代)这样的Web服务框架集成。XFire是一个基于Java...

    xmlschema-core-2.0.3的jar

    4. **命名空间管理**:XML Schema支持命名空间,库能有效地管理和处理命名空间,确保正确解析和引用元素和属性。 5. **错误报告**:在验证过程中,如果发现不符合规范的地方,会生成详细的错误信息,帮助开发者调试...

    XmlSchema-1.4.6.jar

    XML Schema,简称XSD,是一种用于定义XML文档结构和数据类型的规范。`XmlSchema-1.4.6.jar` 是一个包含Java绑定的XML Schema API的库,它为处理XML Schema文档提供了支持。在开发Web服务客户端时,尤其是与基于SOAP...

    XML文件XML Schema.docXML Schema.doc

    在Java中,XML Schema的验证可以使用javax.xml.validation包,提供了独立于模式语言的验证服务接口。该包提供了三个类来验证文档:SchemaFactory、Schema和Validator。 在实际应用中,XML Schema可以用于: 1. ...

    XmlSchema-1.2.jar,xmlschema-1.2.jar,xml.jar

    XmlSchema-1.2.jar,xmlschema-1.2.jar,xml.jar

    XMLSchema.chm

    4. **命名空间**:XML Schema支持命名空间,这是解决XML文档中相同元素名称冲突的关键机制。通过使用命名空间,不同的XML文档或Schema可以共享相同的元素和属性名称,而不会产生混淆。 5. **约束和验证**:XML ...

    apache xmlschema api文档

    - 处理命名空间:API支持处理XML文档中的命名空间,以便正确解析和验证具有多个命名空间的文档。 在实际开发中,Apache XML Schema API通常与DOM(Document Object Model)、SAX(Simple API for XML)或StAX...

    XML Schema简明教程-W3C.rar

    XML Schema 是基于 XML 的 DTD 替代者。 XML Schema 描述 XML 文档的结构。 XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。 在此教程中,你将学习如何在应用...XML Schema 支持命名空间

    XMLSchema经典例题

    2. **命名空间**:XML Schema支持命名空间,这使得在同一文档中可以使用相同的名字而不引起冲突。通过使用`xmlns`属性,我们可以为元素和类型指定独特的命名空间前缀。 3. **约束和验证**:XML Schema提供了一套...

    西工大服务计算实验2-1_XML Schema

    在本实验"西工大服务计算实验2-1_XML Schema"中,你的任务是编写一个程序,生成符合特定XML Schema定义的XML文档。这涉及到对XML Schema的理解、XML文档的创建以及编程技术的应用。 首先,我们需要理解XML Schema的...

    xmlschema-1.4.5.jar.zip

    4. **命名空间支持**:XML Schema允许使用命名空间来区分不同来源或用途的元素和属性。这个库能很好地处理命名空间,使应用可以正确识别和处理它们。 5. **类型系统**:XSD拥有丰富的内置数据类型,如字符串、整数...

    XML Schema xsd XML Schema xsd

    6. **支持命名空间**:XML Schema 与 XML 命名空间兼容,允许在同一个文档中使用来自不同源的元素和属性,避免命名冲突。 7. **可扩展性**:由于 XML Schema 本身就是 XML,所以可以轻松地在其他 Schema 中重用或...

    XML Schema初窥

    3. **命名空间支持**:XML Schema支持名称空间,能够处理多个不同来源的元素和属性,避免命名冲突。DTD不支持名称空间。 4. **更强大的约束机制**:XML Schema提供了更多的方式来约束元素和属性,如最大长度、最小...

Global site tag (gtag.js) - Google Analytics