【问题标题】:XML schema validation, how to ignore tree inside elementXML模式验证,如何忽略元素内的树
【发布时间】:2015-05-12 04:02:09
【问题描述】:

考虑到这个xml:

<myName myClass="grandfather" name="grandfather_name" transaction="new">
<attributes>
    <name>test name</name>
    <description>some stuff for desc</description>
    <version>the current version</version>
</attributes>
<myName myClass="father" name="father_name" transaction="new">
    <attributes>
    <name>test name</name>
    <description>some stuff for desc</description>
    <version>the current version</version>
    <wifeName>name of wife</wifeName>
    </attributes>
    <myName myClass="child_1" name="child_1_name" transaction="new">
        <attributes>
            <name>test name</name>
            <description>some stuff for desc</description>
            <version>the current version</version>
            <GirlFriendName>name of GirlFriend</GirlFriendName>
        </attributes>
    </myName>
    <myName myClass="child_2" name="child_2_name" transaction="new">
        <attributes>
            <name>test name</name>
            <description>some stuff for desc</description>
            <version>the current version</version>
            <GirlFriendName>name of GirlFriend</GirlFriendName>
        </attributes>
    </myName>
</myName>

我只想验证“祖父”及其属性,而忽略 XML 的其余部分。 出于这个原因,我在架构中添加了这一行: type="xs:anyType"

此行导致验证忽略“父亲”,但验证在“child_1”和“child_2”中失败。

“发现以元素'GirlFriendName'开头的无效内容。否 此时需要子元素”

正在使用的 XSD 是这样的:

<?xml version="1.0" encoding="UTF-8"?>

<xs:group name="AttributesGroup"> 
    <xs:all>
        <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1" />
        <xs:element name="description" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="version" type="xs:string" minOccurs="0" maxOccurs="1" />
    </xs:all>
</xs:group>

<!-- BASE COMPLEX TYPES DEFINITIONS -->

<xs:complexType name="MyComplexType">
    <xs:sequence>
        <xs:element name="attributes" minOccurs="1" maxOccurs="unbounded">
            <xs:complexType>
                    <xs:group ref="AttributesGroup"/>
            </xs:complexType>
        </xs:element>

        <xs:element name="myName" type="xs:anyType" minOccurs="0" maxOccurs="unbounded"/>

    </xs:sequence>

    <xs:attribute name="myClass" type="xs:string" use="required" />
    <xs:attribute name="name" type="xs:string" />
    <xs:attribute name="transaction" type="xs:string" use="required" />
</xs:complexType>


<!-- ROOT ELEMENT -->
<xs:element name="myName" type="MyComplexType" />

我怎样才能忽略“父亲”下面的所有内容?

【问题讨论】:

    标签: xml validation xsd


    【解决方案1】:

    你可以在MyComplexType内本地定义的myName中使用xsd:any;以下 XSD 将成功验证您的 XML:

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
               elementFormDefault="unqualified">
        <xs:group name="AttributesGroup"> 
            <xs:all>
                <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1" />
                <xs:element name="description" type="xs:string"
                      minOccurs="0" maxOccurs="1" />
                <xs:element name="version" type="xs:string" minOccurs="0" maxOccurs="1" />
            </xs:all>
        </xs:group>
        <xs:complexType name="MyComplexType">
            <xs:sequence>
                <xs:element name="attributes" minOccurs="1" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:group ref="AttributesGroup"/>
                    </xs:complexType>
                </xs:element>
                <xs:element name="myName" minOccurs="1" maxOccurs="unbounded">
                    <xs:complexType>
              <xs:sequence>
                <xs:any processContents="skip"
                        minOccurs="0" maxOccurs="unbounded"/>
              </xs:sequence>
              <xs:anyAttribute processContents="skip"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="myClass" type="xs:string" use="required" />
            <xs:attribute name="name" type="xs:string" />
            <xs:attribute name="transaction" type="xs:string" use="required" />
        </xs:complexType>
        <xs:element name="myName" type="MyComplexType" />
    </xs:schema>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 2019-12-13
      • 1970-01-01
      相关资源
      最近更新 更多