(作者wxb_nudt,首发于中国XML论坛http://bbs.xml.org.cn/list.asp?boardid=28)
关于XML Schema中的key和unique的概念很多Schema教程里面讲过,可惜网上大部分教程里面的例子是错误的,而且并没有给出完整清晰的解释,我查找了Schema的规范并写出了相应了例子,理清了这两个概念,希望对大家有所帮助。XML Schema规范来自于
http://www.w3.org/TR/xmlschema-0/
1.unique的定义和例子
规范中对于unique是这样定义的:XML Schema enables us to indicate that any attribute or element value must be unique within a certain scope. To indicate that one particular attribute or element value is unique, we use the unique element first to "select" a set of elements, and then to identify the attribute or element "field" relative to each selected element that has to be unique within the scope of the set of selected elements.
译文:XML Schema允许我们指出任意的属性或者元素值在某个范围内是唯一的。为了指出这个属性或者元素值的唯一性,我们使用了unique元素,它首先“选择”一组元素,然后指出这个属性或者元素的“域”在上一步所选择出的元素集合中是唯一的。
例子Schema:UniqueTest.xsd
<?xml version="1.0" encoding="GB2312"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="Person">
<xs:annotation>
<xs:documentation>Comment describing your root element</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" maxOccurs="unbounded"/>
<xs:element name="Id" type="xs:integer" maxOccurs="unbounded">
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="IdUnique">
<xs:selector xpath=".//Id"/>
<xs:field xpath="."/>
</xs:unique>
</xs:element>
</xs:schema>
例子XML:UniqueTest.xml
<?xml version="1.0" encoding="GB2312"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="UniqueTest.xsd">
<Name>wxb_nudt</Name>
<Id>1001</Id>
<Id>1002</Id>
<Id>1001</Id> <!--这儿就会报错,因为它的值和第一个Id重复了,并不是唯一的-->
<Id>1004</Id>
</Person>
2.key的定义和例子
规范中是通过一个较长的例子来说明key和keyref的定义,归纳起来可以做如下定义:XML Schema可以通过将一个元素或者属性定义为一个key,这个key必须是unique的,这个key可以在XML文档中的其他部分通过keyref进行引用,keyref的值一定取自于key的某一个值。key的概念很类似于数据库中的外键。
key的具体定义方法很类似于unique的定义方法,首先“选择”一组元素,然后指出某个属性或者元素的“域”就是一个key。
而keyref与key的定义完全相似,唯一的区别是加了一个refer属性,这个refer属性指出了key的名字,具体例子如下:
例子schema:KeyExam.xsd
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSPY v2004 rel. 3 U (http://www.xmlspy.com) by wxb (nudt) -->
<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:element name="elementTwo" maxOccurs="unbounded">
<xsd:complexType>
<xsd:attribute name="elementTwoKey" type="xsd:integer"/>
<xsd:attribute name="elementOneKey" type="xsd:string"/>
<xsd:attribute name="elementTwoDesc" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:key name="elementOnePK">
<xsd:selector xpath=".//elementOne"/>
<xsd:field xpath="@elementOneDesc"/>
</xsd:key>
<xsd:keyref name="elementOneFK" refer="elementOnePK">
<xsd:selector xpath=".//elementTwo"/>
<xsd:field xpath="@elementTwoDesc"/>
</xsd:keyref>
<xsd:unique name="EOneKeyU" xsi:type="xsd:integer">
<xsd:selector xpath=".//elementOne"/>
<xsd:field xpath="@elementOneKey"/>
</xsd:unique>
</xsd:element>
</xsd:schema>
例子xml:KeyExam.xml
<?xml version="1.0" encoding="UTF-8"?>
<rootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="KeyExam.xsd">
<elementOne elementOneKey="1" elementOneDesc="a"/>
<elementOne elementOneKey="2" elementOneDesc="b"/>
<elementOne elementOneKey="3" elementOneDesc="c"/>
<elementOne elementOneKey="4" elementOneDesc="d"/>
<elementTwo elementOneKey="5" elementTwoDesc="e" elementTwoKey="78"/>
<!--上面的elementTwoDesc作为elementOneDesc的一个keyref,它必须取值于上面的4个key值之一,这里它的值"e"因为不是取值于"a","b","c","d",所以会报错-->
</rootElement>
相关推荐
根据xsd批量生成java类,觉得很方便也很酷。但是有时候xsd生成的java类中含有汉字,结果总是有些问题。 可是xjc命令参数又没有encoding参数之类的。在网上搜了一通,忽然发现了一个好东东:xjc是由...
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:tool="http://www.springframework.org/schema/tool" targetNamespace=...
xsd文件 xsd1.4,xsd2.0,xsd3.0
xml生成xsd 使用方法:java -jar trang.jar EchoRequest.xml EchoRequest.xsd
构建dubbo项目的时候会遇到: Multiple annotations found at this line: - cvc-complex-type.2.4.c: The matching wildcard is strict, but no ... 3) the root element of the document is not <xsd:schema>.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:tool="http://www.springframework.org/schema/tool" targetNamespace=...
1.解决:dubbo找不到dubbo.xsd报错 2.Eclipse配置 选择windows-->preferrence-->xml->xmlcatalog-->add->catalog entry -->file system,选择模版文件(本地下载的)后,修改key值为...
解压后dubbo.xsd 即可用,解压后dubbo.xsd 即可用,解压后dubbo.xsd 即可用,解压后dubbo.xsd 即可用
dubbo配置xml文件报错“Multiple annotations found at this line: - cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'dubbo:...dubbo.xsd文件下载
XML转XSD\DTD工具 W3C XML Schema XSD 工具
1、下载xmlbeans-2.3.0.jar。 2、创建配置文件my.xsdconfig。 3、java方法如下: ... "D:\\2\\dcc.xsd",//xsd文件存放位置 "D:\\2\\my.xsdconfig"};//xsd配置描述文件 SchemaCompiler.main(a); } }
通过xsd文件生成样例xml的工具,有完整源代码
附件是我写的一个demo程序,该程序的功能是根据一个定义好的XSD文件去检查指定的XML文件是否满足XSD的约束。 这里的约束比标准的约束要弱一些,比如:这里的约束不限制元素出现的顺序,只关心有没有这个元素。 我...
java生成xsd,xml示例
XSD使用dom4j校验XML
dubbo.xsd文件。使用dubbo时标签解析不了,需要这个文件来做解析
dubbo项目xml文件报错,不支持dubbo元素,需要在本地安装dubbo.xsd文件。
spring-context-3.2.xsd
这是从google的地址下载的trang,最新版,根目录下的jar可根据xml生成xsd文件,下面介绍使用: 把jar放在 d:\trang 下 假设在 d:\trang 下有一个xml文件person.xml 打开windows命令行,将当前位置cd变更到 d:\trang ...