3

我正在尝试使用简单的 XSD 验证简单的 XML,但总是收到此错误:

cvc-complex-type.2.4.a: Invalid content was found starting with element 'linux'. One of '{linux}' is expected.

为什么?找到了标签“linux”,它是 {linux} 之一!

爪哇代码:

public static void main(String[] args) {
    try {
        InputStream xml = new FileInputStream("data/test.xml");
        InputStream xsd = new FileInputStream("data/test.xsd");

        SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = factory.newSchema(new StreamSource(xsd));

        Validator validator = schema.newValidator();
        validator.validate(new StreamSource(xml));

        log.info("OK!");
    } catch (Exception e) {
        log.error(":(");
        log.error(e.getMessage());
    }
}

数据/test.xml:

<?xml version="1.0" encoding="utf-8"?>
<so xmlns="http://test/">
    <linux>
        <debian>true</debian>
        <fedora>true</fedora>
    </linux>
</so>

数据/test.xsd

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema targetNamespace="http://test/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="so">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="linux">
                    <xs:complexType>
                        <xs:sequence minOccurs="1" maxOccurs="unbounded">
                            <xs:any processContents="lax" maxOccurs="unbounded"/>
                        </xs:sequence></xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
4

2 回答 2

13

因为模式没有指定elementFormDefault="qualified",所以元素“linux”的本地元素声明是在 no namespace 中声明一个元素,但实例在 namespace 中有一个 linux 元素"http://test/"。该错误消息令人困惑,因为它无法明确问题出在名称空间上。

于 2013-08-27T13:49:40.267 回答
0

Dudytz,你<xs:any />是不正确的。无法验证文档,因为需要指示验证者如何验证文档。如果您不希望这样,您可以指定<xs:any>processContents 属性。如果将其设置为“松弛”或“跳过”,它将起作用。

简而言之:替换<xs:any><xs:any processContents="lax" />

更新:我们已将您的 XSD 更改为工作版本:

<xs:schema xmlns="http://test/" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://test/">
<xs:element name="so">
    <xs:complexType>
        <xs:sequence>           
            <xs:element ref="linux"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:element name="linux">
    <xs:complexType>
        <xs:sequence>
            <xs:any processContents="lax" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

于 2013-08-27T10:52:12.083 回答