我有一个 xml 文件,我想使用 JAXB 将它转换成一个 java 对象。我收到与验证相关的异常。似乎 JAXB 正在根据 xml 文件中声明的 DTD 对其进行验证。不幸的是,DTD 不在 xml 文件中提到的位置。所以我保留了一个本地副本并使用 EntityResolver 使 JAXB 使用本地 DTD。代码就像一个魅力。
下面是代码
JAXBContext context = JAXBContext.newInstance(Student.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
final SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
final XMLReader reader = saxParserFactory.newSAXParser().getXMLReader();
reader.setEntityResolver(new EntityResolver() {
@Override
public InputSource resolveEntity(final String publicId, final String systemId) throws SAXException, IOException {
return new InputSource(getClass().getResourceAsStream("/student.dtd"));
}
});
final SAXSource saxSource = new SAXSource(reader, new InputSource(inputStream));
student = (Student) unmarshaller.unmarshal(saxSource);
此代码在我的方法 parse(xmlFilePath) 中。每次我调用 parse 方法时,都会创建一个新的 EntityResolver。这不是多余的吗?我可以在类的构造函数中创建一个 EntityResolver 并将其传递给 setEntityResolver 方法吗?
public StudentParser() {
this.entityResolver = new EntityResolver() {
@Override
public InputSource resolveEntity(final String publicId, final String systemId) throws SAXException, IOException {
return new InputSource(getClass().getResourceAsStream("/student.dtd"));
}
}
}
内部解析方法
public Student parse(filePath) {
...
...
reader.setEntityResolver(this.entityResolver);
...
}
最佳答案
首先,检查这些答案:
- How to disable DTD fetching using JAXB2.0
- Make DocumentBuilder.parse ignore DTD references
- How to read well formed XML in Java, but skip the schema?
- How do I turn off validation when parsing well-formed XML using DocumentBuilder.parse?
- How to ignore inline DTD when parsing XML file in Java
简而言之,您可以完全禁用 DTD 处理。
接下来,只要您的实体解析器是线程安全且可重用的,您绝对不需要每次都创建新实例。
关于java - 在根据 dtd 验证 xml 文件时,我是否应该始终创建 EntityResolver?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26439066/