Ошибка: s4s-elt-символ: в элементах схемы, отличных от "xs:appinfo" и "xs:documentation", недопустимы символы, не являющиеся пробелами

У меня есть эта xml-схема:

<xs:schema  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», недопустимы символы, не являющиеся пробелами. Увидел «Дортмунд».

Вы знаете, в чем проблема?

2 ответа

  1. Stadt и Tabellenplatzне должны быть элементами xml, но должны быть атрибутами элемента Fussballmannschaft. Этот шаблон повторяется с внутренними элементами.

    Схема также не имеет структур, выражающих повторение элементов (а именно Spielerэлемента) и выбор между ролями игрока (Torwart,Verteidiger,Stuermer).

    Использование определения xs:keyrefв схеме кажется неполным — ссылки на ключи не указываются в качестве xs:keyэлементов. Для демонстрации этого использования определен новый корневой элементFussball, который должен отражать намерение схемы формализовать понятие футбольных команд. Этот новый корневой элемент содержит определения key и keyref для атрибута club name и будет необходим в любом случае, как только несколько команд будут представлены в файле (в xml-файле должен быть один корневой элемент ).

    Следующая пара схемы и образца проходит проверку.

    Схема:

    <xs:schema  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>
    

    Ссылки на литературу

  2. Реальная причина, по которой вы получаете эту ошибку,

    S4s-elt-character:в элементах схемы, отличных от «xs:appinfo» и «xs: documentation», не допускаются пробелы

    вы пытаетесь проверить XML-файл как XSD-файл .

    Таким образом, исправьте способ вызова проверяющего синтаксического анализатора, чтобы проверить XML-файл против XSD. См. раздел как связать XML с XSD с помощью schemaLocation или noNamespaceSchemaLocation?

    Кроме того, существует множество дополнительных проблем с самим XSD. См. ответ collapsar для помощи там.