当前位置: 首页 > 知识库问答 >
问题:

XML模式验证,如何忽略元素内部的树

鲜于璞瑜
2023-03-14

考虑到此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”

正在使用的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" />

我怎能无视“父亲”下面的一切?

共有1个答案

竺捷
2023-03-14

您可以在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>
 类似资料:
  • 问题内容: 我有这样的XML消息: 我想将被测试方法产生的这种类型的消息与预期的消息进行比较,但我不在乎。因此,我希望以上消息被认为等于: 我正在使用XMLUnit的最新版本。 我在想答案是创建一个习惯。如果有准备好要使用的东西,我只是不想重新发明轮子。 欢迎使用XMLUnit以外的库的建议。 问题答案: 自从回答了这个问题以来,XMLUnit发生了很多变化。 现在,您可以在使用时轻松忽略节​​点

  • 如果某个接口不需要进行验证工作,可以在@Api注解上设置属性ignoreValidate=true(默认false)。这样调用接口时,不会进行验证操作。 同样的,在@ApiService注解里也有一个对应的ignoreValidate属性,设置为true的话,Service类下面所有的接口都忽略验证。 忽略所有接口验证 设置ApiConfig.setIgnoreValidate(true),所有接

  • 问题内容: 我收到一个XML响应,并且它一直在频繁更改(节点不断增加或减少)。在响应xml中的每次更新之后,由于映射的Java类没有所有文件,所以我的代码中断了。 如果响应XML中发生任何更改,是否有任何方法可以避免我的代码中断。 任何帮助将不胜感激。 谢谢。 问题答案: 要处理未知字段,可以添加带注释的属性 输入中与类的显式属性不对应的任何元素都将被扫入此列表。如果该元素是已知的,则将得到未编组

  • 问题内容: HTML中是否有任何方法告诉浏览器不允许对特定元素进行标签索引? 在我的页面上,尽管有一个用jQuery呈现的杂耍,但是当您通过Tab进行制表时,您会在按下Tab控件移动到页面上的下一个可见链接之前获得大量的制表符按下,因为所有通过制表的内容都被隐藏了。视觉上的用户。 问题答案: 您可以使用。 W3C HTML5规范支持负的值: 如果值为负整数 ,则用户代理必须设置元素的tabinde

  • 问题内容: 我无法弄清楚为什么内联元素在某些浏览器中会忽略(Chrome和Firefox会忽略它,但IE9不会)。 这是一个例子: 预期结果是元素高度为26px,但是将其设置为31px。如果我将元素的显示设置为“阻止”,则高度正确设置为26px。 我读的所有内容都应该设置为行高,因此我无法弄清楚。这是我在W3C上阅读的内容: 计算行框中每个行内框的高度。对于替换的元素,内联块元素和内联表元素,这是

  • 我得到了一个XML响应,它经常变化(节点不断增加或减少)。在响应xml的每次更新之后,我的代码会中断,因为映射的Java类没有所有的文件。 谢了。