使用XSD验证XML包含具有精确值的节点

时间:2014-09-15 09:22:56

标签: xml xsd xsd-validation

我有一些XML:

<common>
    <parameter>
        <name>Param1</name>
        <value>Value1</value>
    </parameter>
    <parameter>
        <name>Param2</name>
        <value>Value2</value>
    </parameter>
</common>

我需要验证确切的2个参数,确切的2个名称:Param1,Param2。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="common" type="CommonType" />

    <xs:complexType name="CommonType">
        <xs:sequence>  
            <xs:element name="parameter" type="ParameterType" maxOccurs="unbounded" minOccurs="0" />  
        </xs:sequence> 
    </xs:complexType>

    <xs:complexType name="ParameterType">
        <xs:sequence>
            <xs:element name="name" type="ParameterNameType"/>
            <xs:element name="value" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>

    <xs:simpleType name="ParameterNameType">
        <xs:restriction base="xs:normalizedString">
            <xs:enumeration value="Param1" minOccurs="1" />
            <xs:enumeration value="Param2" minOccurs="1" />
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

在限制部分中,minOccurs属性在XSD中无效。我该如何实现这样的功能?

2 个答案:

答案 0 :(得分:1)

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="common">
        <xs:complexType>
            <xs:sequence>  
                <xs:element name="parameter" type="ParameterType" maxOccurs="2" minOccurs="2" />  
            </xs:sequence>
        </xs:complexType>
        <xs:unique name="uniqueAuthor">
            <xs:selector xpath="parameter"/>
            <xs:field xpath="name"/>
        </xs:unique>
    </xs:element>
    <xs:complexType name="ParameterType">
        <xs:sequence>
            <xs:element name="name" type="ParameterNameType"/>
            <xs:element name="value" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:simpleType name="ParameterNameType">
        <xs:restriction base="xs:normalizedString">
            <xs:enumeration value="Param1"/>
            <xs:enumeration value="Param2" />
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

答案 1 :(得分:0)

为什么要将参数的名称指定为元素的值?为什么不将它们指定为元素的名称?在这种情况下,所需的声明是微不足道的。