gpt4 book ai didi

java - 解析 XML 时忽略 DTD

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:57:21 26 4
gpt4 key购买 nike

在使用 XOM xml 库解析文件时如何忽略 DTD 声明。我的文件有以下行:

<?xml version="1.0"?>
<!DOCTYPE BlastOutput PUBLIC "-//NCBI//NCBI BlastOutput/EN" "NCBI_BlastOutput.dtd">
//rest of stuff here

当我尝试 build() 我的文档时,我得到了 DTD 文件的 filenotfound 异常。我知道我没有这个文件,也不关心它,那么在使用 XOM 时如何删除它?

这是一个代码片段:

public BlastXMLParser(String filePath) {
Builder b = new Builder(false);
//not a good idea to have exception-throwing code in constructor
try {

_document = b.build(filePath);
} catch (ParsingException ex) {
Logger.getLogger(BlastXMLParser.class.getName()).log(Level.SEVERE,"err", ex);
} catch (IOException ex) {
//
}

private Elements getBlastReads() {
Element root = _document.getRootElement();
Elements rootChildren = root.getChildElements();

for (int i = 0; i < rootChildren.size(); i++) {
Element child = rootChildren.get(i);
if (child.getLocalName().equals("BlastOutput_iterations")) {

return child.getChildElements();
}
}

return null;
}
}

我在这一行得到一个 NullPointerException:

Element root = _document.getRootElement();

从源 XML 文件中删除 DTD 行后,我可以成功解析它,但这不是最终生产系统中的一个选项。

最佳答案

首选解决方案是实现 EntityResolver拦截对 DTD 的请求并将这些请求重定向到嵌入式副本。如果你

  1. 无权访问 DTD 并且
  2. 绝对确定您不需要它(除了验证它还可能声明文档中使用的字符实体)和
  3. 您正在使用 Xerces XML 解析器实现

您可以通过设置相应的 SAX 功能来禁用 DTD 的提取。在 XOM 中,这应该可以通过传递 XMLReader 来实现。像这样的 Builder 构造函数:

import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

...

XMLReader xmlreader = XMLReaderFactory.createXMLReader();
xmlreader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
Builder builder = new Builder(xmlreader);

关于java - 解析 XML 时忽略 DTD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8081214/

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