1

使用 JDOM 时出现错误

org.jdom2.input.JDOMParseException:第 4 行出错:cvc-elt.1:找不到元素“rootElement”的声明。

我有 xsd menu.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema version="1.0"
           targetNamespace="http://www.w3schools.com/menu"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified"
           xmlns="http://www.w3schools.com/menu"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="rootElement"  type="xs:string"/>
</xs:schema>

和 xml menu.xml

<?xml version="1.0"?>
<rootElement xmlns="http://www.w3schools.com/menu"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.w3schools.com/menu menu.xsd">
</rootElement>

使用

public class RunXml
{
    public static void main(String[] args) throws JDOMException, IOException
    {
        SAXBuilder builder = new SAXBuilder(XMLReaders.XSDVALIDATING);
        File    xml = new File("xml/menu.xml");
        InputStream inputStream = new FileInputStream(xml);
        Document document = builder.build(inputStream);
    }
}

接下来是文件。有什么问题?

4

3 回答 3

1

它找不到 xsd。问题解决了:

File xsdfile = new File("xml/menu.xsd");
XMLReaderJDOMFactory schemafac = new XMLReaderXSDFactory(xsdfile);
SAXBuilder builder = new SAXBuilder(schemafac);
于 2013-08-22T07:51:54.000 回答
1

您的部分问题是您与 JDOM 的 build() 方法的输入源相关的“混淆”。在将 File 值提交给 build() 方法之前,您正在执行将文件值转换为 InputStreams 的常见错误做法。事实上,您甚至不需要将字符串值"xml/menu.xml"转换为 File 对象。做就是了:

SAXBuilder builder = new SAXBuilder(XMLReaders.XSDVALIDATING);
Document document = builder.build("xml/menu.xml");

String 值"xml/menu.xml"是一个系统 ID,默认情况下,SAX 解析器会将其解释为具有类似file://./xml/menu.xml. 然后,当它查找menu.xsd模式时,它将相对于该 URI 查找它,它会找到 file://./xml/menu.xsd

当您给构建方法一个 InputStream 实例时,没有系统 ID 附加到 InputSource,因此它无处可查找menu.xsd文件。

只有在别无选择的情况下,您才应该使用 build(...) 方法的 InputStream 和 Reader 版本,并且,如果您确实使用这些方法,您应该尝试使用您也可以提供系统 ID 的版本。

我应该更新这些方法的文档,以便更容易避免这个问题。

于 2013-08-22T16:21:27.320 回答
-1
<rootElement xmlns="http://www.w3schools.com/menu"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.w3schools.com/menu menu.xsd">
</rootElement>

在xml中的这个地方

<rootElement xmlns="http://www.w3schools.com/menu"

在 xsd

targetNamespace="http://www.w3schools.com/menu"

设置一个有效的 URI

于 2013-08-22T09:01:41.150 回答