从XML缓慢构建树结构

时间:2009-07-16 11:36:06

标签: java xml optimization parsing tree

我正在将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 ...完成[3ms]
  • 创建docBuilder ...完成[21ms]
  • 解析文件...完成[5646ms]
  • getDocumentElement ...完成[1ms]
  • 创建DomTree ...完成[17076ms]

更新:

正如John Doe在下面建议的那样使用SAX可能更合适 - 我之前从未使用过SAX,那么有什么方法可以将我所拥有的内容转换为使用SAX吗?

2 个答案:

答案 0 :(得分:2)

如果您正在解析大型XML,则不使用DOM,使用SAX,拉取解析器(如XPP3)或其他任何东西。

问题是你在内存中没有“XML树”可能很方便,你只能得到事件并相应地处理它们。但是它将是内存方面的,您可以将元素映射到数据结构。

答案 1 :(得分:0)

您是否尝试过分析这个?我认为这可能比查看代码更有启发性。通常情况下,瓶颈会显示出您通常从未预料到的。一个简单的配置文件(您可以在代码中轻松完成)是对DOM解析与树构建进行计时。

要进行更深入的分析,JProfiler可用作评估副本。其他人可能会推荐更合适的东西。