我有一个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);这段代码在我的方法解析(XmlFilePath)中。每次我调用解析方法时,都会创建一个新的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);
...
}发布于 2014-10-18 11:27:01
首先,检查以下答案:
简而言之,您可以完全禁用DTD处理。
接下来,只要您的实体解析器是线程安全和可重用的,那么您肯定不需要每次都创建新实例。
https://stackoverflow.com/questions/26439066
复制相似问题