java - 在根据 dtd 验证 xml 文件时,我是否应该始终创建 EntityResolver?

标签 java xml jaxb

我有一个 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);
    ...
}

最佳答案

首先,检查这些答案:

简而言之,您可以完全禁用 DTD 处理。

接下来,只要您的实体解析器是线程安全且可重用的,您绝对不需要每次都创建新实例。

关于java - 在根据 dtd 验证 xml 文件时,我是否应该始终创建 EntityResolver?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26439066/

相关文章:

java - JAXB @XmlElements,不同类型但名称相同?

java - 如何使用 Jersey 1 进行 ChunkOutput?

JAXB 和继承

java - 使用另一个 void 方法的变量从方法中获取值

java - 为什么无论我将组件存储在何处,我的 Java 代码都无法在 Eclipse 中运行?

java - Hibernate:动态连接多个表

javascript - 在 IE 10 中转换 XML AJAX 响应时出错

Java ExecutorService - 扩展

xml - 在 Haskell 中,如何从 XML 文档中提取字符串?

xml - 如何编写 Wcf 服务来接受 xml 数据?