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

Mit*_*tev 36 xsd xml-namespaces xml-validation xml-error

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

XML文件

<?xml version="1.0" encoding="utf-8"?> 
<MyElement>A</MyElement>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

Mar*_*nen 35

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

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


小智 8

在进行了马丁上述建议的更改后,我仍然遇到同样的错误。我必须对我的解析代码进行额外的更改。我通过 DocumentBuilder 解析 XML 文件,如 oracle 文档中所示: 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"));
Run Code Online (Sandbox Code Playgroud)

问题是 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"));
Run Code Online (Sandbox Code Playgroud)