错误:S4s-elt-character:“xs:appinfo”和“xs:documentation”以外的架构元素中不允许使用非空白字符

Posted

技术标签:

【中文标题】错误: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' 【发布时间】:2018-12-15 13:00:09 【问题描述】:

我有这个 xml 架构:

<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”以外的架构元素中不允许使用非空白字符。看过《多特蒙德》。

你知道问题出在哪里吗?

【问题讨论】:

【参考方案1】:

您收到此错误的真正原因,

S4s-elt-character:除“xs:appinfo”和“xs:documentation”之外的架构元素中不允许使用非空白字符

是您尝试将您的 XML 文件验证为 XSD 文件

因此,请修正调用验证解析器的方式,以便针对 XSD 验证 XML 文件。见How to link XML to XSD using schemaLocation or noNamespaceSchemaLocation?

此外,您的 XSD 本身还有许多其他问题。请参阅collapsar's answer 以获取帮助。

【讨论】:

【参考方案2】:

我们也遇到过这个问题。原因是架构 http:://xyz.xsd 的地址被替换为 https:://xyz.xsd。我们的模式库无法通过 http 转发到 https 地址。所以我们简单地将xml文件中的http地址改为https地址。

【讨论】:

【参考方案3】:

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

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

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

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

架构:

<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 关于keykeyref 的使用

【讨论】:

谢谢,但我仍然收到此错误:“S4s-elt-character:除 'xs:appinfo' 和 'xs:documentation' 之外的架构元素中不允许使用非空白字符。看到 ' BVB'.",当我在freeformatter.com/xml-validator-xsd.html验证时 @Marc 是的,Spieler 元素及其子元素也有类似的问题。后者也必须是属性。 +1 以获得所有出色的 XSD 帮助,但 OP 问题中错误的真正原因是他试图 validate the XML file itself as if it were an XSD

以上是关于错误:S4s-elt-character:“xs:appinfo”和“xs:documentation”以外的架构元素中不允许使用非空白字符的主要内容,如果未能解决你的问题,请参考以下文章

iPhone XR/XS:AVAssetExportSession 状态失败并出现错误

元素“xs:schema”的前缀“xs”未绑定

在 mplot3d 的 scatter() 上获取值错误:参数 xs 和 ys 必须具有相同的大小。但它们的大小相同

安装 Perl 模块时出现“致命错误:找不到‘EXTERN.h’文件”

除非模拟器是 XS 类型,否则屏幕上的按钮不起作用

Pandas中xs()函数:SyntaxError: can‘t assign to function call