cvc-elt.1:找不到元素'MyElement'的声明

时间:2012-11-09 15:12:36

标签: xsd xml-namespaces xml-validation xml-error

我正在尝试使用xsd验证一个非常简单的xml,但由于某种原因我得到了这个错误。 如果有人能解释我原因,我真的很感激。

XML文件

<?xml version="1.0" encoding="utf-8"?> 
<MyElement>A</MyElement>

XSD文件

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.example.org/Test"
        xmlns:tns="http://www.example.org/Test"
        elementFormDefault="qualified">

    <simpleType name="MyType">
        <restriction base="string"></restriction>
    </simpleType>

    <element name="MyElement" type="tns:MyType"></element>
</schema>

4 个答案:

答案 0 :(得分:31)

您的架构是针对其目标命名空间http://www.example.org/Test的,因此它在该目标命名空间MyElement中定义了名为http://www.example.org/Test的元素。但是,您的实例文档在无名称空间中有一个名为MyElement的元素。这就是为什么验证解析器告诉你它找不到该元素的声明,你没有为没有命名空间的元素提供模式。

您需要更改架构以完全不使用目标命名空间,或者您需要更改要使用的实例,例如<MyElement xmlns="http://www.example.org/Test">A</MyElement>

答案 1 :(得分:0)

我的XXX元素出现此错误,原因是我的XSD根据javax.xml.bind v2.2.11格式错误。我认为它使用较旧的XSD格式,但我没有打算确认。

我最初错误的XSD与以下内容类似:

<xs:element name="Document" type="Document"/>
...
<xs:complexType name="Document">
    <xs:sequence>
        <xs:element name="XXX" type="XXX_TYPE"/>
    </xs:sequence>
</xs:complexType>

我迁移成功的优秀XSD格式如下:

<xs:element name="Document">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="XXX"/>
        </xs:sequence>
    </xs:complexType>        
</xs:element>
...
<xs:element name="XXX" type="XXX_TYPE"/>

对于每个类似的XSD节点都是如此。

答案 2 :(得分:0)

我在使用Maven的Eclipse中遇到同样的错误,并附带了其他信息

schema_reference.4: Failed to read schema document 'https://maven.apache.org/xsd/maven-4.0.0.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.

这是在复制新控制器及其Thymeleaf示例中的界面之后进行的。老实说,无论我多么谨慎,我仍然不知所措。我很幸运地右键单击了该项目,然后单击了“ Maven和更新项目”,从而解决了问题。

答案 3 :(得分:0)

在做出马丁建议的更改之后,我仍然遇到相同的错误。我必须对解析代码进行其他更改。我正在通过DocumentBuilder解析XML文件,如oracle docs所示: https://docs.oracle.com/javase/7/docs/api/javax/xml/validation/package-summary.html

// parse an XML document into a DOM tree
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = parser.parse(new File("example.xml"));

问题是默认情况下DocumentBuilder不支持名称空间。以下其他更改解决了该问题:

// parse an XML document into a DOM tree
DocumentBuilderFactory dmfactory = DocumentBuilderFactory.newInstance();
dmfactory.setNamespaceAware(true);

DocumentBuilder parser = dmfactory.newDocumentBuilder();
Document document = parser.parse(new File("example.xml"));