XSD中的唯一元素未强制执行

时间:2016-07-19 20:57:50

标签: xml xsd xsd-validation xml-validation

我正在尝试为XML创建XSD并尝试强制执行 var rCreditCard = realm.All<RCreditCard>().First(); 约束,但它没有强制执行约束。我究竟做错了什么?

这是XSD

xs:unique

这里的XML应该是无效的,因为2个联系人具有相同的id(0)

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
           elementFormDefault="qualified"
           attributeFormDefault="unqualified"
           vc:minVersion="1.1"
           xmlns:o="http://www.osames.org/osamesorm">
  <xs:element name="DATA">
    <xs:annotation>
      <xs:documentation>Element that contain data</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element name="ACCOUNTID" type="xs:string"/>
        <xs:element name="CONTACTS" type="CONTACTType"/>
      </xs:sequence>
    </xs:complexType>
    <xs:unique name="unique-contactid">
      <xs:selector xpath="o:CONTACT"/>
      <xs:field xpath="@ID"/>
    </xs:unique>      
  </xs:element>
  <xs:element name="CONTACT">
    <xs:annotation>
      <xs:documentation>
        Contact Element contain one contact configuration/data
      </xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:all>
        <xs:element name="ID" type="xs:int"/>
        <xs:element name="TITLE" type="xs:string"/>
        <xs:element name="TYPE" type="xs:int"/>
        <xs:element name="CONTACTSTRING" type="xs:string"/>
      </xs:all>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="CONTACTType">
    <xs:annotation>
      <xs:documentation>Complex Contect Type</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element ref="CONTACT"  minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

现在确定我做错了什么。

1 个答案:

答案 0 :(得分:0)

您的xs:unique声明,

    <xs:unique name="unique-contactid">
      <xs:selector xpath="o:CONTACT"/>
      <xs:field xpath="@ID"/>
    </xs:unique>                        

您必须解决几个问题:

  1. CONTACT不在命名空间中;放下o:
  2. CONTACTCONTACTS之内;将该元素添加到XPath。
  3. @ID不是属性,而是元素;更改为ID
  4. 然后,以下xs:unique声明,

        <xs:unique name="unique-contactid">
            <xs:selector xpath="CONTACTS/CONTACT"/>
            <xs:field xpath="ID"/>
        </xs:unique>                    
    

    将按要求运作。