我正在将一个 XML 文档解析成我自己的结构,但构建它对于大量输入来说非常慢,有没有更好的方法来做到这一点?
public static DomTree<String> createTreeInstance(String path)
throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = docBuilderFactory.newDocumentBuilder();
File f = new File(path);
Document doc = db.parse(f);
Node node = doc.getDocumentElement();
DomTree<String> tree = new DomTree<String>(node);
return tree;
}
这是我的 DomTree 构造函数:
/**
* Recursively builds a tree structure from a DOM object.
* @param root
*/
public DomTree(Node root){
node = root;
NodeList children = root.getChildNodes();
DomTree<String> child = null;
for(int i = 0; i < children.getLength(); i++){
child = new DomTree<String>(children.item(i));
if (children.item(i).getNodeType() != Node.TEXT_NODE){
super.children.add(child);
}
}
}
更新:
我已经使用 100MB 的 XML 文件对 createTreeInstance() 方法进行了基准测试:
- 正在创建 docBuilderFactory... 完成 [3 毫秒]
- 正在创建 docBuilder... 完成 [21 毫秒]
- 正在解析文件...完成 [5646ms]
- getDocumentElement...完成 [1 毫秒]
- 正在创建 DomTree... 完成 [17076ms]
更新:
正如 John Doe 在下面所建议的那样,使用 SAX 可能更合适 - 我以前从未使用过 SAX,那么有什么好的方法可以将我必须使用的东西转换为使用 SAX 吗?
最佳答案
如果您要解析大型 XML,则不使用 DOM,而是使用 SAX、诸如 XPP3 之类的拉式解析器或其他任何东西。
问题是你不会在内存中有一个可能很方便的“XML 树”,你只能获取事件并相应地处理它们。然而,这将是内存明智的,您可以将元素映射到您的数据结构。
关于java - 从 XML 构建树结构缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1136974/