我正在将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()方法进行了基准测试:
更新:
正如John Doe在下面建议的那样使用SAX可能更合适 - 我之前从未使用过SAX,那么有什么方法可以将我所拥有的内容转换为使用SAX吗?
答案 0 :(得分:2)
如果您正在解析大型XML,则不使用DOM,使用SAX,拉取解析器(如XPP3)或其他任何东西。
问题是你在内存中没有“XML树”可能很方便,你只能得到事件并相应地处理它们。但是它将是内存方面的,您可以将元素映射到数据结构。
答案 1 :(得分:0)
您是否尝试过分析这个?我认为这可能比查看代码更有启发性。通常情况下,瓶颈会显示出您通常从未预料到的。一个简单的配置文件(您可以在代码中轻松完成)是对DOM解析与树构建进行计时。
要进行更深入的分析,JProfiler可用作评估副本。其他人可能会推荐更合适的东西。