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

XSD架构错误,基类型应为复杂类型,如何修复?

康言
2023-03-14
<league year="2014" source="www.ico.org"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="champions.xsd">
    <sources>
        <source metalane="top">
                    <champion name="wukong">
                            <popularity>8.18</popularity>
                            <banrate>0.51</banrate>
                    </champion>
                    <champion name="renekton">          
                            <popularity>24.26</popularity>
                            <banrate>8.69</banrate>
                    </champion>
                    <champion name="riven">
                            <popularity>11.75</popularity>
                            <banrate>12.85</banrate>
                    </champion>     
                    <champion name="drmundo">
                            <popularity>12.11</popularity>
                            <banrate>64.46</banrate>
                    </champion>     
        </source>

        <source metalane="mid">
                <champion name="ziggs">
                        <popularity>15.09</popularity>
                        <banrate>20.56</banrate>
                </champion>     
                <champion name="gragas">
                        <popularity>22.45</popularity>
                        <banrate>25.89</banrate>
                </champion>
                <champion name="kayle">
                        <popularity>13.63</popularity>
                        <banrate>9.37</banrate>
                </champion>
                <champion name="khazix">
                        <popularity>21.71</popularity>
                        <banrate>37.28</banrate>
                </champion>         
        </source>

        <source metalane="marksman">
                <champion name="lucian">
                        <popularity>18.95</popularity>
                        <banrate>1.18</banrate>
                </champion>     
                <champion name="ezreal">
                        <popularity>21.26</popularity>
                        <banrate>0.11</banrate>
                </champion>
                <champion name="draven">
                        <popularity>15.88</popularity>
                        <banrate>5.85</banrate>
                </champion>
                <champion name="jinx">
                        <popularity>34.82</popularity>
                        <banrate>4.98</banrate>
                </champion>     
        </source>
    </sources>
</league>

下面是我的xsd模式文件

<xs:schema version="1.0"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified">

    <!-- A year is a 4-digit integer, except the year must be >= 1998. -->
    <xs:simpleType name="Tyear">
        <xs:restriction base="xs:integer">
            <xs:pattern value="\d{4}"/>
            <xs:minInclusive value="1998"/>
        </xs:restriction>
    </xs:simpleType>

    <!-- A lane is a string which specifies which location on the map a champion goes -->
    <xs:simpleType name="Tmetalane">
        <xs:restriction base="xs:string">

        </xs:restriction>
    </xs:simpleType>

    <!-- A name is a string which specifies a champions name -->
    <xs:simpleType name="Tname">
        <xs:restriction base="xs:string">

        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="Tperc">
        <xs:restriction base="xs:decimal">    
            <xs:minExclusive value="0.0"/>
            <xs:fractionDigits value="2"/>
        </xs:restriction>    
    </xs:simpleType>

    <!-- A definition associates a metalane with a value.  -->
    <xs:complexType name="Tdefinition">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="metalane" type="Tmetalane"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <!-- A name definition associates a champion with a value.  -->
    <xs:complexType name="Tnamedefinition">
        <xs:complexContent>
            <xs:extension base="xs:string">
                <xs:attribute name="name" type="Tname"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>


    <!-- league
    The root element is *league*.
    It contains a sources element which contains multiple source elements.
    -->
    <xs:element name="league">        
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="sources" maxOccurs="unbounded"/>        
            </xs:sequence>
            <xs:attribute name="year" type="Tyear"/>
            <xs:attribute name="source" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>

    <!-- sources
    The *sources* element defines multiple metalanes which
    contain champion information regarding that lane.
    -->
    <xs:element name="sources">        
        <xs:complexType>
            <xs:sequence>
                <xs:element name="source" type="Tdefinition" maxOccurs="unbounded"/>        
            </xs:sequence>
        </xs:complexType>
        <xs:unique name="metalanes">
            <xs:selector xpath="source"/>
            <xs:field xpath="@metalane"/>
        </xs:unique>
    </xs:element>

    <!-- source
    The *source* element contains multiple champion elements
    -->
    <xs:element name="source">        
        <xs:complexType>
            <xs:sequence>
                <xs:element name="champion" type="Tnamedefinition" maxOccurs="unbounded"/>        
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <!-- champion
    The *champion* element contains a banrate and popularity element
    -->
    <xs:element name="champion">        
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="popularity"/>        
                <xs:element ref="banrate"/>
            </xs:sequence>
            <xs:attribute name="name" type="Tname"/>
        </xs:complexType>
    </xs:element>

    <!-- A *popularity* element defines how often a champion is picked  -->
    <xs:element name="popularity">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="Tperc">
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

    <!-- A *banrate* element defines how often a champion is banned  -->
    <xs:element name="banrate">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="Tperc">
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

</xs:schema>

共有1个答案

张丰
2023-03-14

您声明了 。不能使用简单类型(xs:string)作为扩展的基类型。必须是复杂类型。

您将 定义为具有匿名嵌套复杂类型的顶级元素,然后在中定义为TnameDefinition。在XML源代码中,我认为您实际上应该声明一个对顶级champion的引用,并删除type声明:

<xs:element name="source">        
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="champion" maxOccurs="unbounded"/>        
        </xs:sequence>
    </xs:complexType>
</xs:element> 

然后可以删除导致错误的tnameDefinition的类型声明。

<xs:element name="sources">        
    <xs:complexType>
        <xs:sequence>
            <xs:element name="source" type="Tdefinition" maxOccurs="unbounded"/>        
        </xs:sequence>
    </xs:complexType>

tdefinition是一个复杂类型,内容简单,只允许使用属性。可以将属性声明移动到元素定义中的复杂类型:

<xs:element name="source">        
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="champion" maxOccurs="unbounded"/>        
        </xs:sequence>
        <xs:attribute name="metalane" type="Tmetalane" />
    </xs:complexType>
</xs:element>

您也不需要tdefinition,而应该声明source作为顶级元素的引用。

<xs:element name="sources">        
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="source" maxOccurs="unbounded"/>        
        </xs:sequence>
    </xs:complexType>
    ...
</xs:element>

通过这些更改,文档将被验证。但是您也有一堆未使用的类型声明,除非您的其他XML实例与这里显示的实例非常不同,否则您可能不会使用这些声明,并且可以删除这些声明。例如,除非vopulationbanrate具有属性,否则可以将它们声明为简单类型:

<xs:element name="popularity" type="Tperc"/>
<xs:element name="banrate" type="Tperc"/>

由于您不在其他任何地方使用它们,您还可以将它们嵌套在champion定义中。

我假设tmetalanetname是您仍在处理的类型(因为限制已经到位,但为空)。

进行更改并删除未使用的类型,得到的架构如下所示:

<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

    <xs:simpleType name="Tyear">
        <xs:restriction base="xs:integer">
            <xs:pattern value="\d{4}"/>
            <xs:minInclusive value="1998"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="Tmetalane">
        <xs:restriction base="xs:string">
            <!-- to be added  -->
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="Tname">
        <xs:restriction base="xs:string">
            <!-- to be added -->
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="Tperc">
        <xs:restriction base="xs:decimal">    
            <xs:minExclusive value="0.0"/>
            <xs:fractionDigits value="2"/>
        </xs:restriction>    
    </xs:simpleType>

    <xs:element name="league">        
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="sources" maxOccurs="unbounded"/>        
            </xs:sequence>
            <xs:attribute name="year" type="Tyear"/>
            <xs:attribute name="source" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="sources">        
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="source" maxOccurs="unbounded"/>        
            </xs:sequence>
        </xs:complexType>
        <xs:unique name="metalanes">
            <xs:selector xpath="source"/>
            <xs:field xpath="@metalane"/>
        </xs:unique>
    </xs:element>

    <xs:element name="source">        
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="champion" maxOccurs="unbounded"/>        
            </xs:sequence>
            <xs:attribute name="metalane" type="Tmetalane" />
        </xs:complexType>
    </xs:element>

    <xs:element name="champion">        
        <xs:complexType>
            <xs:sequence>
                <xs:element name="popularity" type="Tperc"/>
                <xs:element name="banrate" type="Tperc"/>
            </xs:sequence>
            <xs:attribute name="name" type="Tname"/>
        </xs:complexType>
    </xs:element>
</xs:schema>
 类似资料:
  • 我将Camel与Spring Boot一起使用。在基本上记录消息正文的服务路由实现过程中,我看到了如下所示的错误。 我的路线是: 我在日志正文行中出现错误。 我的问题是预期的行为?为什么Camel不只是调用对象的方法。如果这是预期的行为,那么我需要一个字符串转换器来处理每个新的复杂类型?

  • 我在这段代码上得到这个错误! 错误:无法将预期类型(integer->integer->Integer)->(integer->Integer)->integer->Integer'与实际类型Integer匹配

  • 我试图编写我的第一个XSD . . . XSD如下,不验证。 我在用http://www.utilities-online.info/xsdvalidation/为了验证 我得到了这个错误 无效。错误-第7行,49:org.xml.sax.SAXParseExctive; lineNumber: 7; block nNumber: 49; src-解决.4.2:解决组件“xsd: Hdr”的错误。

  • 我收到此错误: 电动汽车.java:第 6 行:构造函数 类汽车中的汽车不能应用于给定的类型; 我不确定为什么会这样,因为ElectricCar构造函数没有引用超类(除了扩展它的类)。我该如何解决这个问题? 这是我的代码: CarTester.java: 电动汽车.java:(此类的第 6 行出现错误) } 汽车. java: }

  • 我正在遵循这个视频教程(文本版本相同)。我遵循了完全相同的代码,并收到了以下错误: 错误TS2339:属性“Get Employees”在类型“EmployeeService”上不存在

  • 我对Java很陌生,当我试图编译我的代码时,我总是收到这个编译错误: "MyRectangle.java: 3:错误:构造函数类中的矩形矩形不能应用于给定类型;矩形矩形1=新矩形(5.0,10.0,"red");^必需:未找到参数:双精度,双精度,字符串原因:实际和正式参数列表长度不同 MyRectangle.java: 8:错误:构造函数类中的矩形矩形不能应用于给定类型;矩形矩形2=新矩形(3.