不同元素中相同属性的XML值不能重复

时间:2015-06-15 16:52:41

标签: xml xsd

在我的C#应用​​程序中,我使用XSD文件来验证XML文件。有没有办法在XSD文件中包含防止在不同元素中重复Reference_number属性的值?

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Items">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="Item">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Name" type="xs:string" />
              <xs:element name="Reference_number" type="xs:string" />
              <xs:element name="Price" type="xs:float" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

2 个答案:

答案 0 :(得分:3)

为此,您应该使用元素键或唯一的元素。 像这样的东西:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Items">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="Item">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Name" type="xs:string" />
                            <xs:element name="Reference_number" type="xs:string" />
                            <xs:element name="Price" type="xs:float" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
        <xs:key name="referenceKey">
            <xs:selector xpath="Item"/>
            <xs:field xpath="Reference_number"/>
        </xs:key>
    </xs:element>
</xs:schema>

答案 1 :(得分:3)

您可以使用xs:uniqueReference_number限制为唯一:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified"
           elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Items">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="Item">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Name" type="xs:string" />
              <xs:element name="Reference_number" type="xs:string" />
              <xs:element name="Price" type="xs:float" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
    <xs:unique name="UniqueItemRefNum">
      <xs:selector xpath="Item" /> 
      <xs:field xpath="Reference_number" /> 
    </xs:unique>
  </xs:element>
</xs:schema>

然后,例如,以下XML将有效:

<?xml version="1.0" encoding="utf-8"?>
<Items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="try.xsd">
  <Item>
    <Name>name1</Name>
    <Reference_number>r1</Reference_number>
    <Price>1.00</Price>
  </Item>
  <Item>
    <Name>name2</Name>
    <Reference_number>r2</Reference_number>
    <Price>2.00</Price>
  </Item>
</Items>

但以下XML无效(请注意重复Reference_number):

<?xml version="1.0" encoding="utf-8"?>
<Items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="try.xsd">
  <Item>
    <Name>name1</Name>
    <Reference_number>r1</Reference_number>
    <Price>1.00</Price>
  </Item>
  <Item>
    <Name>name2</Name>
    <Reference_number>r1</Reference_number>
    <Price>2.00</Price>
  </Item>
</Items>