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

48

我试图使用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>
5个回答

47
您的模式是针对其目标命名空间 http://www.example.org/Test 的,因此它在该目标命名空间 http://www.example.org/Test 中定义了一个名为 MyElement 的元素。但是,您的实例文档中有一个名为 MyElement 的元素在无名称空间中。这就是验证解析器告诉您找不到该元素声明的原因,因为您没有为无名称空间中的元素提供模式。
要么您需要更改模式以根本不使用目标命名空间,要么您需要更改实例,例如使用<MyElement xmlns="http://www.example.org/Test">A</MyElement>

7
在执行马丁建议的更改后,我仍然遇到了相同的错误。我不得不对我的解析代码进行额外的更改。我正在按照Oracle文档所示,通过DocumentBuilder解析XML文件: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"));

2

我遇到了一个与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节点都是如此。

1
我在使用带有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和Update Project,解决了这个问题。

0
进一步扩展顶部答案。如果您正在使用Java Web Services(JAX-WS)注释来定义您的服务,就像在这个例子中一样:
@WebService(..., targetNamespace = "http://bar.foo.com/")

然后确保您的SOAP请求与注释中定义的命名空间完全相同:

<soapenv:Envelope 
   xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
   xmlns:foo="http://bar.foo.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <foo:someRequest>
          ...
      </foo:someRequest>
   </soapenv:Body>
</soapenv:Envelope>

你的注释中的targetNamespace和XML请求中的xmlns:foo属性必须匹配!每个字符(包括空格)都必须完全匹配。此外,不要忘记在结尾处放置/(这是一个非常常见的错误)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接