gpt4 book ai didi

XML 架构 xs :choice inside xs:sequence

转载 作者:行者123 更新时间:2023-12-04 04:58:58 30 4
gpt4 key购买 nike

我正在尝试使用 xs:choice 元素,但是在验证 XSD 文件时,我收到一个错误,我认为它与 xs:choice 元素有关。我已经搜索了很多这个问题,找到了一些类似的问题,但没有一个给我我正在寻找的答案以解决我的问题。

我想要做的是,声明一个名为“数据”的元素,其子元素将是时间戳和传感器或提供者(这里是我尝试使用选择元素的地方,因为我只想要一个传感器或provider 元素作为时间戳的兄弟)。

以下 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>

但是,一旦我上传文件并尝试使用 following w3 website 对其进行验证,我就会收到以下错误:

file:/usr/local/XSV/xsvlog/tmph7cMmLuploaded:45:6: Invalid per cvc-complex-type.1.2.4: element {None}:element not allowed here (1) in element {http://www.w3.org/2001/XMLSchema}:choice, expecting [{http://www.w3.org/2001/XMLSchema}:annotation,$,{http://www.w3.org/2001/XMLSchema}:element,{http://www.w3.org/2001/XMLSchema}:group,{http://www.w3.org/2001/XMLSchema}:choice,{http://www.w3.org/2001/XMLSchema}:sequence,{http://www.w3.org/2001/XMLSchema}:any]:



我认为问题出在 xs:choice 元素中,但我可能是错的。

因为这是我第一次尝试使用 xs:choice 元素,所以我怀疑我是否正确使用它。根据 w3schools 中的示例,我是,但由于我打算在另一个元素旁边使用它,所以我不知道它是否正确。

如果有人能帮助我解决这个问题,我将不胜感激。

非常感谢提前。

最佳答案

在您的 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>

所以这就是发生的事情:
  • 你的 XML 定义了一个默认的 XML 命名空间;因此,您的 XSD 必须定义一个匹配的命名空间,因此请查看新的 targetNamespace 属性和添加的默认 xmlns 以匹配它。
  • 由于您的所有元素都经过了限定(由于在根级别使用了默认命名空间),因此您的架构应该使用 elementFormDefault="qualified"
  • 您的选择问题是您有 &lt;element ref="provider" 等需要 xs: 限定符(这是您提供的错误的要点)
  • 我已经在你的 XSD 中添加了 timestamp 元素。

  • 但是,通过这些更改,问题现在变成了您的 XML,尤其是 origin 属性。由于您已将属性声明为全局,因此必须在 XSD 的命名空间中对其进行限定,因此我添加了 xmln:tns=... 和 fixin tns: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 架构 xs :choice inside xs:sequence,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16384324/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com