`

xsd

 
阅读更多

(作者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类,觉得很方便也很酷。但是有时候xsd生成的java类中含有汉字,结果总是有些问题。 可是xjc命令参数又没有encoding参数之类的。在网上搜了一通,忽然发现了一个好东东:xjc是由...

    dubbo.xsd文件

    &lt;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

    xsd文件 xsd1.4,xsd2.0,xsd3.0

    xml生成xsd工具

    xml生成xsd 使用方法:java -jar trang.jar EchoRequest.xml EchoRequest.xsd

    dubbo找不到dubbo.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 &lt;xsd:schema&gt;.

    dubbo.xsd阿里巴巴开源xsd文件

    &lt;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=...

    dubbo.xsd下载

    1.解决:dubbo找不到dubbo.xsd报错 2.Eclipse配置 选择windows--&gt;preferrence--&gt;xml-&gt;xmlcatalog--&gt;add-&gt;catalog entry --&gt;file system,选择模版文件(本地下载的)后,修改key值为...

    dubbo的.xsd文件分享

    解压后dubbo.xsd 即可用,解压后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工具

    XML转XSD\DTD工具 W3C XML Schema XSD 工具

    使用xmlbeans讲xsd生成Jar文件

    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工具

    通过xsd文件生成样例xml的工具,有完整源代码

    根据XSD检查XML并修复

    附件是我写的一个demo程序,该程序的功能是根据一个定义好的XSD文件去检查指定的XML文件是否满足XSD的约束。 这里的约束比标准的约束要弱一些,比如:这里的约束不限制元素出现的顺序,只关心有没有这个元素。 我...

    java生成xsd,xml示例

    java生成xsd,xml示例

    XSD使用dom4j校验XML

    XSD使用dom4j校验XML

    dubbo xsd的支持

    dubbo.xsd文件。使用dubbo时标签解析不了,需要这个文件来做解析

    dubbo.xsd文件路径

    dubbo项目xml文件报错,不支持dubbo元素,需要在本地安装dubbo.xsd文件。

    spring-context-3.2.xsd

    spring-context-3.2.xsd

    xml转xsd,trang.jar最新版

    这是从google的地址下载的trang,最新版,根目录下的jar可根据xml生成xsd文件,下面介绍使用: 把jar放在 d:\trang 下 假设在 d:\trang 下有一个xml文件person.xml 打开windows命令行,将当前位置cd变更到 d:\trang ...

Global site tag (gtag.js) - Google Analytics