【发布时间】:2016-09-08 14:29:17
【问题描述】:
我有一个简单的 xml 文件 contacts.xml,位于实际文件夹的子文件夹 xml-files 中。
<contacts xsi:noNamespaceSchemaLocation="contacts.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<contact>
<firstname>AAA</firstname>
<lastname>BBB</lastname>
</contact>
</contacts>
架构文件也位于子文件夹xml-files中。
解析文件代码:
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
SAXParser parser = factory.newSAXParser();
parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
SAXReader reader = new SAXReader(parser.getXMLReader());
reader.setValidation(true);
reader.read("xml-files/contacts.xml");
我想使用 SAXReader 的 read 方法,它以 java.io.Reader 作为参数,像这样
reader.read(new FileReader("xml-files/contacts.xml"));
但我得到异常
org.dom4j.DocumentException:文档第 2 行出错:cvc-elt.1:找不到元素“联系人”的声明。嵌套异常:cvc-elt.1:找不到元素“联系人”的声明。
使用自定义实体解析器显示,在第一种情况下,xsd 文件是从路径 file:///e:/devel/xsd/xml-files/contacts.xsd 加载的,在第二种情况下是 file:///e:/ devel/xsd/contacts.xsd.
有什么方法可以将 xsd 文件所在的文件夹设置为 SAXReader?
【问题讨论】:
-
我还没有尝试过这个,但是看看这个关于另一个问题的答案,看看在 SAXParserFactory 上设置架构是否适合你:stackoverflow.com/a/8282734/1423896
-
这可行,但我不能使用它,因为可能有更多的 xml 文件并且它们可以有不同的 xsd。
-
查看
SchemaFactory(docs.oracle.com/javase/7/docs/api/javax/xml/validation/…) 的 Javadoc。newSchema(..)方法接受Source数组。您也许可以将所有架构文件放入SchemaFactory以获取合并的Schema以设置您的SaxParserFactory
标签: java xml xml-validation