XML同一属性在不同元素中的取值不能重复
XML values of the same attribute in different elements cannot repeat
在我的 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>
为此,您应该使用元素键或唯一元素。
像这样:
<?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>
您可以使用xs:unique
来约束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: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>
在我的 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>
为此,您应该使用元素键或唯一元素。 像这样:
<?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>
您可以使用xs:unique
来约束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: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>