错误:S4s-elt-character:“xs:appinfo"和“xs:documentation"以外的架构元素中不允许使用非空白字符 [英] Error: S4s-elt-character: Non-whitespace Characters Are Not Allowed In Schema Elements Other Than 'xs:appinfo' And 'xs:documentation'

查看:25
本文介绍了错误:S4s-elt-character:“xs:appinfo"和“xs:documentation"以外的架构元素中不允许使用非空白字符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个 xml 架构:

I have this xml-Schema:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
attributeFormDefault="unqualified">
        <xs:element name="Fussballmannschaft">
                <xs:complexType>
                        <xs:attribute name="Name" type="xs:string" />
                        <xs:attribute name="Stadt" type="xs:string" />
                        <xs:attribute name="Tabellenplatz" type="xs:string" />
                        <xs:element name="Spieler">
                                <xs:complexType>
                                        <xs:attribute name="SpielerID" type="xs:string" />
                                        <xs:keyref name="I_D" refer="Name" />
                                        <xs:attribute name="Name" type="xs:string" />
                                        <xs:element name="Torwart">
                                                <xs:attribute name="GehealteneElfmeter" type="xs:integer" />
                                                <xs:keyref name="ID_Torwart" refer="SpielerID" />
                                        </xs:element>
                                        <xs:element name="Verteidiger">
                                                <xs:attribute name="GewonneneZweikaempfe" type="xs:integer" />
                                                <xs:keyref name="ID_Verteidiger" refer="SpielerID" />
                                        </xs:element>
                                        <xs:element name="Stuermer">
                                                <xs:attribute name="GeschosseneTore" type="xs:integer" />
                                                <xs:keyref name="ID_Stuermer" refer="SpielerID" />
                                        </xs:element>
                                </xs:complexType>
                        </xs:element>
                </xs:complexType>
        </xs:element>
</xs:schema>

还有这个示例:

<Fussballmannschaft Name="BVB">
<Stadt>Dortmund</Stadt>
<Tabellenplatz>3</Tabellenplatz>
    <Spieler SpielerID="1">
        <I_D>BVB</I_D>
        <Name>Oliver</Name>
        <Torwart>
            <GehealteneElfmeter>20</GehealteneElfmeter>
            <ID_Torwart>1</ID_Torwart>
        </Torwart>
    </Spieler>

    <Spieler SpielerID="2">
        <I_D>BVB</I_D>
        <Name>Peter</Name>
        <Torwart>
            <GewonneneZweikaempfe>20</GewonneneZweikaempfe>
            <ID_Verteidiger>2</ID_Verteidiger>
        </Torwart>
    </Spieler>

    <Spieler SpielerID="3">
        <I_D>BVB</I_D>
        <Name>Paul</Name>
        <Torwart>
            <GeschosseneTore>20</GeschosseneTore>
            <ID_Stuermer>3</ID_Stuermer>
        </Torwart>
    </Spieler>
</Fussballmannschaft>

但是解析器说:

S4s-elt-character:xs:appinfo"和xs:documentation"以外的架构元素中不允许使用非空白字符.看过《多特蒙德》.

S4s-elt-character: Non-whitespace Characters Are Not Allowed In Schema Elements Other Than 'xs:appinfo' And 'xs:documentation'. Saw 'Dortmund'.

你知道问题出在哪里吗?

Do you know where the problem is?

推荐答案

StadtTabellenplatz 不能是xml元素,必须是元素的属性Fussballmannschaft.这种模式与内部元素重复.

Stadt and Tabellenplatz mustn't be xml elements but need to be attributes of the element Fussballmannschaft. This pattern repeats with the inner elements.

该模式还缺乏表达元素重复的结构(即 Spieler 元素)和玩家角色之间的选择(TorwartVerteidigerStuermer).

The schema also lacks structures to express repetition of elements (namely the Spieler element) and choices between player roles (Torwart,Verteidiger,Stuermer).

在架构定义中使用 xs:keyref 似乎不完整 - 引用的键未指定为 xs:key 元素.为了演示这种用法,定义了一个新的根元素 Fussball,它应该反映模式的意图,以将足球队的概念正式化.这个新的根元素包含俱乐部名称属性的 key 和 keyref 定义,并且一旦要在一个文件中表示多个球队(在 xml 文件中必须有一个根元素),无论如何都将需要它.

The use of the xs:keyref in the schema definition appears to be incomplete - the referenced keys are not specified as xs:key elements. In order to demonstrate this use, a new root element Fussball is defined, which should reflect the intent of the schema to formalize the notion of soccer teams. This new root element harbors the key and keyref definitions for the club name attribute and will be needed anyway as soon as multiple teams are to be represented in in a file (there must be a single root element in an xml file ).

以下一对模式和样本通过了验证.

The following pair of schema and sample passes the validation.

架构:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
attributeFormDefault="unqualified">
    <xs:element name="Fussball">
        <xs:complexType mixed="true">
            <xs:sequence>
                <xs:element name="Fussballmannschaft">
                    <xs:complexType mixed="true">
                        <xs:sequence>
                            <xs:element name="Spieler" maxOccurs="unbounded">
                                <xs:complexType mixed="true">
                                    <xs:choice>
                                        <xs:element name="Torwart">
                                            <xs:complexType>
                                                <xs:attribute name="GehalteneElfmeter" type="xs:integer" />
                                                <xs:attribute name="ID_Torwart" type="xs:integer" />
                                            </xs:complexType>
                                        </xs:element>
                                        <xs:element name="Verteidiger">
                                            <xs:complexType>
                                                <xs:attribute name="GewonneneZweikaempfe" type="xs:integer" />
                                                <xs:attribute name="ID_Verteidiger" type="xs:integer" />
                                            </xs:complexType>
                                        </xs:element>
                                        <xs:element name="Stuermer">
                                            <xs:complexType>
                                                <xs:attribute name="GeschosseneTore" type="xs:integer" />
                                                <xs:attribute name="ID_Stuermer" type="xs:integer"/>
                                            </xs:complexType>
                                        </xs:element>
                                    </xs:choice>
                                    <xs:attribute name="I_D" type="xs:string" />
                                    <xs:attribute name="SpielerID" type="xs:integer" />
                                    <xs:attribute name="Spielername" type="xs:string" />
                                </xs:complexType>
                            </xs:element><!-- Spieler -->
                        </xs:sequence>
                        <xs:attribute name="Name" type="xs:string" />
                        <xs:attribute name="Stadt" type="xs:string" />
                        <xs:attribute name="Tabellenplatz" type="xs:string" />
                    </xs:complexType>

                    <xs:key name="k-Spieler">
                        <xs:selector xpath="./Spieler"/>
                        <xs:field xpath="@SpielerID"/>
                    </xs:key>
                    <xs:keyref name="kref-Spieler" refer="k-Spieler">
                        <xs:selector xpath="./Spieler/Stuermer|./Spieler/Torwart|./Spieler/Verteidiger"/>
                        <xs:field xpath="@ID_Stuermer|@ID_Torwart|@ID_Verteidiger"/>
                    </xs:keyref>
                </xs:element><!-- Fussballmannschaft -->
            </xs:sequence>
        </xs:complexType>

        <!--
            A 'key' tells you how to uniquely reference an element instance - eg. one among several soccer teams. 
        -->
        <xs:key name="k-Verein">
            <xs:selector xpath="./Fussballmannschaft"/>
            <xs:field xpath="@Name"/>
        </xs:key>

        <!--
            A 'keyref' specifies that some attribute value(s) are not only constrained by their datatype but must also uniquely identify a certain element in the file - a semantic relationship is established.
        -->
        <xs:keyref name="kref-Verein" refer="k-Verein">
            <xs:selector xpath="./Fussballmannschaft/Spieler"/>
            <xs:field xpath="@I_D"/>
        </xs:keyref>
    </xs:element><!-- Fussball -->
</xs:schema>

XML:

<Fussball>
    <Fussballmannschaft Name="BVB" Stadt="Dortmund" Tabellenplatz="3">
        <Spieler SpielerID="1" I_D="BVB" Spielername="Oliver">
            <Torwart GehalteneElfmeter="20" ID_Torwart="1"/>
        </Spieler>
        <Spieler SpielerID="2" I_D="BVB" Spielername="Peter">
            <Verteidiger GewonneneZweikaempfe="20" ID_Verteidiger="2"/>
        </Spieler>
        <Spieler SpielerID="3" I_D="BVB" Spielername="Paul">
            <Stuermer GeschosseneTore="20" ID_Stuermer="3"/>
        </Spieler>
    </Fussballmannschaft>
</Fussball>

参考文献

  • W3C XML Schema Definition
  • W3C XML Schema Definition / identity constraints
  • SO answer on the use of key and keyref

这篇关于错误:S4s-elt-character:“xs:appinfo"和“xs:documentation"以外的架构元素中不允许使用非空白字符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆