使用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);
}
}
文件是下一个。有什么问题?
答案 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