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

XML架构xs:choice inside xs:sequence

百里业
2023-03-14

下面的XML是我试图验证的:

<?xml version="1.0" encoding="ISO-8859-1"?>
<experience xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<data>
    <timestamp>123456789</timestamp>
    <sensor origin="proximity" >
        <x-axis>9</x-axis>
        <y-axis>0</y-axis>
        <z-axis>0</z-axis>
        <w-axis>0</w-axis>
    </sensor>
</data>
</experience>

为了验证这个XML,我编写了以下XSD文件:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- definition of attributes -->
<xs:attribute name="origin" type="xs:string" />

<!-- definition of complex elements -->
    <xs:element name="provider">
        <xs:complexType>
            <xs:all>
                <xs:element name="latitude"  type="xs:float" />
                <xs:element name="longitude" type="xs:float" />
                <xs:element name="altitude"  type="xs:float" />
                <xs:element name="bearing"   type="xs:float" />
                <xs:element name="speed"     type="xs:float" />
            </xs:all>
            <xs:attribute ref="origin" use="required"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="sensor">
        <xs:complexType>
            <xs:all>
                <xs:element name="x-axis" type="xs:float" />
                <xs:element name="y-axis" type="xs:float" />
                <xs:element name="z-axis" type="xs:float" />
                <xs:element name="w-axis" type="xs:float" />
            </xs:all>
            <xs:attribute ref="origin" use="required"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="data">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="timestamp" minOccurs="1" maxOccurs="1" />

                <xs:choice>
                    <element ref="provider" />
                    <element ref="sensor" />
                </xs:choice>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

<!-- definition of main type -->
    <xs:element name="experience">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="data" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

但一旦我上传文件并尝试使用以下w3网站验证它,我得到以下错误:

事先多谢。

共有1个答案

曾宏毅
2023-03-14

在您的XML和XSD中有一些移动目标;因此,下面的XSD和XML都进行了最低限度的修改,以便相互匹配...

修改的XSD:

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3schools.com" targetNamespace="http://www.w3schools.com" elementFormDefault="qualified">

    <!-- definition of attributes -->
    <xs:attribute name="origin" type="xs:string"/>

    <!-- definition of complex elements -->
    <xs:element name="provider">
        <xs:complexType>
            <xs:all>
                <xs:element name="latitude" type="xs:float"/>
                <xs:element name="longitude" type="xs:float"/>
                <xs:element name="altitude" type="xs:float"/>
                <xs:element name="bearing" type="xs:float"/>
                <xs:element name="speed" type="xs:float"/>
            </xs:all>
            <xs:attribute ref="origin" use="required"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="sensor">
        <xs:complexType>
            <xs:all>
                <xs:element name="x-axis" type="xs:float"/>
                <xs:element name="y-axis" type="xs:float"/>
                <xs:element name="z-axis" type="xs:float"/>
                <xs:element name="w-axis" type="xs:float"/>
            </xs:all>
            <xs:attribute ref="origin" use="required"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="timestamp" type="xs:long"/>

    <xs:element name="data">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="timestamp" minOccurs="1" maxOccurs="1"/>

                <xs:choice>
                    <xs:element ref="provider"/>
                    <xs:element ref="sensor"/>
                </xs:choice>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <!-- definition of main type -->
    <xs:element name="experience">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="data" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

修改的XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<experience xmlns="http://www.w3schools.com" xmlns:tns="http://www.w3schools.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <data>
        <timestamp>123456789</timestamp>
        <sensor tns:origin="proximity">
            <x-axis>9</x-axis>
            <y-axis>0</y-axis>
            <z-axis>0</z-axis>
            <w-axis>0</w-axis>
        </sensor>
    </data>
</experience>

我已经在XSD中添加了timestamp元素

但是,有了这些更改,问题就变成了XML了,特别是origin属性。由于您声明了该属性为全局属性,因此必须在XSD的命名空间中对其进行限定,因此我添加了xmln:tns=...和fixintns:origin=...

如果您真的不想更改XML,那么您的XSD应该在本地定义属性(而不是引用),或者将属性包装到一个组中并引用它。因此,这里有一个与原始XML匹配的更新的XSD。

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3schools.com" targetNamespace="http://www.w3schools.com" elementFormDefault="qualified">
    <xs:attributeGroup name="origin">
        <!-- definition of attributes -->
        <xs:attribute name="origin" type="xs:string"/>      
    </xs:attributeGroup>

    <!-- definition of complex elements -->
    <xs:element name="provider">
        <xs:complexType>
            <xs:all>
                <xs:element name="latitude" type="xs:float"/>
                <xs:element name="longitude" type="xs:float"/>
                <xs:element name="altitude" type="xs:float"/>
                <xs:element name="bearing" type="xs:float"/>
                <xs:element name="speed" type="xs:float"/>
            </xs:all>
            <xs:attributeGroup ref="origin"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="sensor">
        <xs:complexType>
            <xs:all>
                <xs:element name="x-axis" type="xs:float"/>
                <xs:element name="y-axis" type="xs:float"/>
                <xs:element name="z-axis" type="xs:float"/>
                <xs:element name="w-axis" type="xs:float"/>
            </xs:all>
            <xs:attributeGroup ref="origin"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="timestamp" type="xs:long"/>

    <xs:element name="data">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="timestamp" minOccurs="1" maxOccurs="1"/>

                <xs:choice>
                    <xs:element ref="provider"/>
                    <xs:element ref="sensor"/>
                </xs:choice>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <!-- definition of main type -->
    <xs:element name="experience">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="data" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
 类似资料:
  • 我对XML非常陌生,我面临着验证问题,如果我的XML和XSD文件结构良好,我也希望得到一些反馈。 在根据XSD验证XML时,我经常遇到错误- 下面的XML XSD 如果你发现其中任何一个有任何错误,请随时指出。它们都有从图案到最大长度的限制。 谢谢!!!!

  • 如何使XML模式接受一个元素的两个属性? 我一直尝试这样编写XSD: 我还尝试用。 每次尝试用XMLLINT验证它时,它都会抛出如下所示的错误: ?

  • 我的猜测是我没有以正确的方式声明模式文档,但我不知道错误到底在哪里。我做错了什么?

  • 17.4 基于 XML 架构的配置 可以使用来自 OXM 命名空间的 XML 标签是对编组器的配置变得更简洁。要使用这些标签,请在 XML 文件开头引用恰当的 XML 架构。以下是一个引用 oxm 的示例,请注意粗体字部分: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/sch

  • 问题内容: 但是,这将返回一条错误消息:线程“ main”中的异常java.lang.IllegalArgumentException:无法加载实现由http://www.w3.org/2001/XMLSchema -instance 指定的模式语言的SchemaFactory。 这是我的代码还是实际的xsd文件有问题? 问题答案: 该错误意味着您安装的Java没有任何可解析XMLSchema文件

  • 使用eclipse时,我消除了所有错误,但当我更改xml文档中的元素内容时,超出了中设置的限制。xsd文件没有出现验证错误。我已尝试使用联机验证http://www.freeformatter.com/xml-validator-xsd.html我得到了错误“Cvc elt.1:找不到元素“DatabaseInventory”…行“4”,列“69”的声明”,但在eclipse中它验证得很好。不知道