错误:从元素“X”开始发现无效内容。预计会有一个'{X}'

时间:2013-08-27 10:27:01

标签: java xml xsd

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

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

为什么呢?标签'linux'被找到并且是{linux}!

之一

java代码:

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>

2 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:0)

Dudytz,你的<xs:any />不正确。无法验证文档,因为需要指示验证程序如何验证文档。如果您不想这样,可以指定<xs:any> processContents属性。如果将其设置为“lax”或“skip”,它将起作用。

简而言之:将<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>