如何以特定方式验证Xml

时间:2017-02-05 21:31:00

标签: c# .net xml xslt xsd

我的问题是我不知道如何正确编写允许我以这种方式验证xml的xsd:

我需要几个必要的节点(以任何顺序)并允许任何其他节点在根

所以例如我需要验证这样的xml,有2个必要的节点:

<root>
    <necessary1/>
    <someRandomNode1/>
    <necessary2/>
    <someRandomNode2/>
    <someRandomNode3/>
</root>

但这必须是任何顺序,<xs:any/>可能不是我想要的。

编辑:

这个'someRandomNodeX'不是节点的名称,它可以是一切。此未指定节点的数量也是未知的。

1 个答案:

答案 0 :(得分:0)

如果可以在不同的名称空间中创建所需元素和非必需元素,则可以使用解决方案。它需要XML Schema 1.1。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1"
    xmlns:namespace="http://www.example.com/"
    targetNamespace="http://www.example.com/">
    <xs:element name="root">
        <xs:complexType>
            <xs:choice maxOccurs="unbounded">
                <xs:element name="necessary1" type="xs:string"/>
                <xs:element name="necessary2" type="xs:string"/>
                <xs:any namespace="##other" processContents="lax"/>
                <xs:any namespace="##local" processContents="lax"/>
            </xs:choice>
            <xs:assert test="exactly-one(namespace:necessary1) and exactly-one(namespace:necessary2)"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

这证实了:

<?xml version="1.0" encoding="UTF-8"?>
<namespace:root
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.example.com test.xsd"
      xmlns:namespace="http://www.example.com/">
    <namespace:necessary1/>
    <someRandomNode1/>
    <namespace:necessary2/>
    <someRandomNode2/>
    <someRandomNode3/>
</namespace:root>