新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> DTD, XML Schema(XMLS), RELAX NG
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 DTD/XML Schema 』 → [原创]XMLSchema中的key和unique问题 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 4197 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: [原创]XMLSchema中的key和unique问题 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     wxb_nudt 帅哥哟,离线,有人找我吗?
      
      
      等级:大三(要不要学学XML呢?)
      文章:72
      积分:505
      门派:XML.ORG.CN
      注册:2004/12/9

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wxb_nudt发送一个短消息 把wxb_nudt加入好友 查看wxb_nudt的个人资料 搜索wxb_nudt在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看wxb_nudt的博客楼主
    发贴心情 [原创]XMLSchema中的key和unique问题

    (作者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>


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    我的blog:MDA之路!欢迎讨论MDA,XML,UML,Eclipse,JAVA的朋友来看看。
    http://www.blogjava.net/wxb_nudt/

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/12/13 9:31:00
     
     luhujun 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:55
      门派:XML.ORG.CN
      注册:2005/8/9

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给luhujun发送一个短消息 把luhujun加入好友 查看luhujun的个人资料 搜索luhujun在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看luhujun的博客2
    发贴心情 
    请教:我通过.net 无法验证唯一键;请赐教:
    XmlTextReader xtr=null;
        XmlValidatingReader xvr=null;
        xtr=new XmlTextReader(xmlFile);//构造非验证读取器
        XmlSchemaCollection xsc=new XmlSchemaCollection();//构造Schema架构缓存
        // xsc.Add("http://www.tuha.net",xsdFile);//在缓存中添加架构文件及对应名字空间//tempuri
        //xsc.Add("",xsdFile);
        xvr=new XmlValidatingReader(xtr);//构造验证读取器
        xvr.Schemas.Add(xsc);//关联验证读取器与架构集合
        xvr.ValidationType=ValidationType.Schema;//设置验证类型为Schema架构   
             xvr.ValidationEventHandler+=new ValidationEventHandler(vCallback);
    ENT_BADNESSLOG200508010001.xml:

    <?xml version="1.0" standalone="yes"?>
    <DataSet5BadNessLog2 xmlns="http://www.tempuri.org">
      <ENT_BADNESSLOG>
        <FENTCODE>000000000002</FENTCODE>
        <FNUMBER>01</FNUMBER>
        <FFILETITLE>dfgjk</FFILETITLE>
        <FPUNISHTIME>2003-3-3  </FPUNISHTIME>
        <FPUNISH>567</FPUNISH>
        <FCONCLUSION>567</FCONCLUSION>
        <FDEPT>dfg</FDEPT>
        <FZBTBBM>dfg                  </FZBTBBM>
        <FHTBABM>dfg                  </FHTBABM>
      </ENT_BADNESSLOG>
      <ENT_BADNESSLOG>
        <FENTCODE>000000000002</FENTCODE>
        <FNUMBER>02</FNUMBER>
        <FFILETITLE>dfgjk</FFILETITLE>
        <FPUNISHTIME>2003-3-3  </FPUNISHTIME>
        <FPUNISH>567</FPUNISH>
        <FCONCLUSION>567</FCONCLUSION>
        <FDEPT>dfg</FDEPT>
        <FZBTBBM>dfg                  </FZBTBBM>
        <FHTBABM>dfg                  </FHTBABM>
      </ENT_BADNESSLOG>
      <ENT_BADNESSLOG>
        <FENTCODE>000000000002</FENTCODE>
        <FNUMBER>02</FNUMBER>
        <FFILETITLE>dfgjk</FFILETITLE>
        <FPUNISHTIME>2003-3-3  </FPUNISHTIME>
        <FPUNISH>567</FPUNISH>
        <FCONCLUSION>567</FCONCLUSION>
        <FDEPT>dfg</FDEPT>
        <FZBTBBM>dfg                  </FZBTBBM>
        <FHTBABM>dfg                  </FHTBABM>
      </ENT_BADNESSLOG>
    </DataSet5BadNessLog2>


    ENT_BADNESSLOG.xsd:
    <?xml version="1.0" standalone="yes"?>
    <xs:schema id="DataSet5BadNessLog2" targetNamespace="http://www.tempuri.org" xmlns:mstns="http://www.tempuri.org" xmlns="http://www.tempuri.org" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified">
      <xs:element name="DataSet5BadNessLog2" msdata:IsDataSet="true" msdata:Locale="zh-CN">
        <xs:complexType>
          <xs:choice maxOccurs="unbounded">
            <xs:element name="ENT_BADNESSLOG">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="FENTCODE" type="xs:string" />
                  <xs:element name="FNUMBER" type="xs:string" minOccurs="0" />
                  <xs:element name="FFILETITLE" type="xs:string" minOccurs="0" />
                  <xs:element name="FPUNISHTIME" type="xs:string" minOccurs="0" />
                  <xs:element name="FPUNISH" type="xs:string" minOccurs="0" />
                  <xs:element name="FCONCLUSION" type="xs:string" minOccurs="0" />
                  <xs:element name="FDEPT" type="xs:string" minOccurs="0" />
                  <xs:element name="FZBTBBM" type="xs:string" minOccurs="0" />
                  <xs:element name="FHTBABM" type="xs:string" minOccurs="0" />
                  <xs:element name="FUSERID" type="xs:string" minOccurs="0" />
                  <xs:element name="FAREACODE" type="xs:string" minOccurs="0" />
                  <xs:element name="FREMARK" type="xs:string" minOccurs="0" />
                </xs:sequence>
              </xs:complexType>
                      <xs:unique name="Constraint1">
                      <xs:selector xpath=".//mstns:ENT_BADNESSLOG" />
        <xs:field xpath="mstns:FPEOCODE" />
        <xs:field xpath="mstns:FNUMBER" />
      </xs:unique>
            </xs:element>
          </xs:choice>
        </xs:complexType>
      </xs:element>
    </xs:schema>

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/8/23 15:54:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 DTD/XML Schema 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2025/9/20 0:15:24

    本主题贴数2,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    93.994ms