使用参数XMLReaders.XSDVALIDATING处理SAXBuilder时出错

时间:2013-08-22 07:23:11

标签: java xml xsd jdom

使用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);
    }
}

文件是下一个。有什么问题?

3 个答案:

答案 0 :(得分:1)

无法找到xsd。 问题解决了:

File xsdfile = new File("xml/menu.xsd");
XMLReaderJDOMFactory schemafac = new XMLReaderXSDFactory(xsdfile);
SAXBuilder builder = new SAXBuilder(schemafac);

答案 1 :(得分:1)

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

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

字符串值"xml/menu.xml"是系统ID,默认情况下,SAX解析器会将其解释为具有类似file://./xml/menu.xml的SystemID。然后,当它查找menu.xsd模式时,它将查找相对于该URI的内容,并且它将找到file://./xml/menu.xsd

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

当没有其他选择时,您应该只使用build(...)方法的InputStream和Reader版本,如果您执行使用这些方法,您应该尝试使用您也可以提供系统ID的版本。

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

答案 2 :(得分:-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