java - 从 XML 构建树结构缓慢

标签 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... 完成 [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/

相关文章:

java - 如何让我的彩色图标显示在我的 GUI 上?

java - JAVA 字符串的 SQL 注入(inject)模拟

XML Schema 类型别名?

c# - Linq 查询 XML 以选择子节点的多个元素

javascript - XHTML 或 SVG 中的 Ecmascript

c# - 多次使用属性时的性能考虑

android - APK 不会安装 : DalvikVM cannot optimize it (Byte swap and verify fails)

java - Eclipse 格式化程序设置

java - 授权过滤器中的错误(JEE6)

c++ - 枚举类型检查