gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:13:26 28 4
gpt4 key购买 nike

我有一个 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com