【问题标题】:Why is this XML valid against this XSD?为什么这个 XML 对这个 XSD 有效?
【发布时间】:2020-08-21 14:35:54
【问题描述】:

我是 XML 新手,现在正在解析 XML 文件。在验证 XML 文件时,我们收到一个错误:

发现以元素“nxce:element”开头的无效内容。此时不需要子元素。

XSD 使用了 4 个元素的选择指示器。 XML 文件包含所有 4 个元素的条目,因此我们认为错误是由于错误使用选择指示器而发生的。实际的 XML 非常复杂,因此为了检查选择指标的工作情况并使用更简单的文件重现相同的错误,我开发了一个 XML 文件和一个 XSD 文件。当我验证 XML 文件时,我期待错误,但验证 XML 文件时没有任何错误。

XML 文件

<?xml version="1.0" encoding="UTF-8"?>
<employee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="file:///EmployeeSchema.xsd">
<emp>
    <empid>3</empid>
    <name>Name</name>
    <address>
        <building>Building</building>
        <pincode>Pincode</pincode>
        <street>Street</street>
        <area>Area</area>
    </address>
</emp>
</employee>

XSD 文件

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="employee">
<xs:complexType>
    <xs:sequence>
        <xs:element name="emp">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="empid" type="xs:string"/>
                    <xs:element name="name" type="xs:string"/>
                    <xs:element name="address">
                        <xs:complexType>
                            <xs:choice>
                                <xs:sequence>
                                    <xs:element name="street" type="xs:string" />
                                    <xs:element name="area" type="xs:string" />
                                </xs:sequence>
                                <xs:sequence>
                                    <xs:element name="building" type="xs:string" />
                                    <xs:element name="pincode" type="xs:string" />
                                </xs:sequence>
                            </xs:choice>    
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>      
        </xs:complexType>   
    </xs:element>
</xs:sequence>  
</xs:complexType>
</xs:element>
</xs:schema>

由于choice 指示符指定可能出现一个子元素或另一个子元素,我预计会出现address 标记中的错误,我使用了所有4 个元素。但是 XML 在 eclipse 中被验证没有任何错误。 请告诉我,为什么我在验证 XML 时没有收到错误?

【问题讨论】:

    标签: xml eclipse xsd xsd-validation xml-validation


    【解决方案1】:

    您希望您的 XML 对您的 XSD 无效的期望是正确的。

    您的 XML 甚至可能没有针对您的预期 XSD 进行验证,因为您的 XML 指定了

    xsi:schemaLocation="file:///EmployeeSchema.xsd"
    

    应该在哪里指定:

    xsi:noNamespaceSchemaLocation="file:///EmployeeSchema.xsd"
    

    请注意,xsi:schemaLocation 采用命名空间 URL pairs,而不仅仅是 XSD 的 URL,以在每个命名空间的基础上定位 XSD。由于您的 XML 不使用命名空间,因此请使用如上所示的 xsi:noNamespaceSchemaLocation 而不是 xsi:schemaLocation

    另见

    【讨论】:

    • 我想你的意思是说“你对你的 XML 无效的期望是正确的”。
    • 你是对的,当你的评论进来时我正在修复。谢谢!
    • @MichaelKay:顺便说一句,我相信使用xsi:namespaceSchemaLocation 用于基于名称空间的关联和xsi:schemaLocation 用于无名称空间关联的命名/语义更容易出错。
    • 个人认为xsi:schemaLocation不应该被使用。如果您不相信文档是有效的,为什么要相信它会告诉您在哪里可以找到架构?
    • 因为xsi:schemaLocation 在实践中用作 XML-XSD 关联的独立于验证器的机制,用于在信任 XSD 分配但希望在发生验证失败时得到通知的合作方之间而非敌对方之间进行关联给定声明的赋值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    相关资源
    最近更新 更多