`

dom4j中两种DocumentFactory对性能的影响

 
阅读更多

   一种是默认的DocumentFactory,第二个是IndexedDocumentFactory,《Java And XML》一书中说,后者会把元素名装载到一个Map中,所以查找元素时性能比较好。但经过测试,并不是使用了它就会提高性能的,是在一定的条件下,才会产生作用。先把完整测试类贴出来,包含生成测试数据的方法。

 

package javaxml3;

import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.dom4j.util.IndexedDocumentFactory;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class XMLReadAllNodesExample2 {
    public static final String sampleName = "e:/temp/4.xml";
    public static final int findCount = 1000;

    public static void main(String[] args) throws DocumentException, IOException {
        generateSampleFileWithDiffName(sampleName, 2000);

        System.out.println("default factory: " + testFindByDefaultFactory("25", findCount));
        System.out.println("indexed factory: " + testFindByIndexedFactory("25", findCount));
    }

    /**
     * generate sample xml which will be saved to path--sampleName
     *
     * @param fileName
     * @param amount
     * @throws IOException
     */
    private static void generateSampleFileWithDiffName(String fileName, int amount) throws IOException {
        DocumentFactory factory = DocumentFactory.getInstance();
        Document doc = factory.createDocument();

        addElement(factory, doc, "Company");
        Element root = doc.getRootElement();

        for (int i = 0; i < amount; i++) {
            Element person = addElement(factory, root, "person" + (i + 1), i + 1);
        }

        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setSuppressDeclaration(false);
        XMLWriter writer = new XMLWriter(new FileWriter(fileName), format);

        writer.write(doc);

        writer.close();
    }

    private static void addElement(DocumentFactory factory, Document parent, String name) {
        parent.add(factory.createElement(name));
    }

    private static Element addElement(DocumentFactory factory, Element parent, String name, Object value) {
        Element newElem = factory.createElement(name);
        parent.add(newElem.addText(value + ""));
        return newElem;
    }

    /**
     * find element person25 with DocumentFactory
     *
     * @param id
     * @param count
     * @return
     * @throws DocumentException
     */
    private static long testFindByDefaultFactory(String id, int count) throws DocumentException {

        SAXReader reader = new SAXReader(DocumentFactory.getInstance());
        Document doc = reader.read(new File(sampleName));
        Node root = doc.selectSingleNode("Company");
        XPath xpath = DocumentHelper.createXPath("person" + id);
        long start = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            root.selectSingleNode("person" + id);//使用doc.selectSingleNode,则xpath为"//person"+id
        }
        long end = System.currentTimeMillis();
        long elapsed = end - start;

        return elapsed;
    }

    /**
     * find element person25 with IndexedDocumentFactory
     *
     * @param id
     * @param count
     * @return
     * @throws DocumentException
     */
    private static long testFindByIndexedFactory(String id, int count) throws DocumentException {

        SAXReader reader = new SAXReader(IndexedDocumentFactory.getInstance());
        Document doc = reader.read(new File(sampleName));
        Node root = doc.selectSingleNode("Company");
        long start = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            root.selectSingleNode("person" + id);//使用doc.selectSingleNode,则xpath为"//person"+id
        }

        long end = System.currentTimeMillis();
        long elapsed = end - start;

        return elapsed;
    }


}

 

  • 生成测试数据
    在main方法中只保留generateSampleFileWithDiffName这行,sampleName定义的测试数据位置修改成你本机的合适位置,运行,数据生成,然后注掉该行
  • 测试两种工厂的性能
    循环次数findCount设成1000的时候,IndexedDocumentFactory的方式只需要60多ms即可完成1000次循环查找,而默认工厂类则需要4秒多,随着次数的加大,差距越来越明显。但是,如果修改下程序,selectSingleNode的时候,不是从元素Company开始,而是使用doc对象来selectSingleNode,这时你会发现两者查找起来速度同样慢,1000次循环大概就需要6秒多。IndexedDocumentFactory就没什么用了,起作用的时候,是要查找的元素和查找入口点是直接上下级的关系,如果在company和person元素再加一层元素,比如employees,而入口搜索点仍是company元素,效果会如何呢?这个时候,仍然是不起作用的,即使加大虚拟机最大内存数也没有效果。

    结论

         IndexedDocumentFactory不是灵丹妙药,它起作用是需要一定的条件的,它适合于搜索点和被搜索的元素处于直接上下级的关系,非常适合于我们在程序中一些元素结构一致但类别不要求一致的情况下,保存并查找资源、配置等信息。

分享到:
评论

相关推荐

    Java解析XML文档(DOM与DOM4j两种方式)

    Java提供了多种解析XML的API,其中DOM(Document Object Model)和DOM4j是常用的两种方法。本文将详细介绍这两种方式以及如何使用它们进行XML文档的增、删、改查操作。 一、DOM解析 DOM解析器将整个XML文档加载到...

    分别使用DOM和DOM4j解析XML文件

    本篇文章将详细介绍如何使用DOM(Document Object Model)和DOM4j这两种流行的方法来解析XML文件。 首先,DOM是一种标准的W3C推荐的解析XML的方法,它将整个XML文档加载到内存中,形成一个树形结构,便于程序进行...

    dom4j-jar与dom4j解析xml文档介绍

    2. **XML解析方式**:dom4j提供了两种主要的XML解析方式:SAX(Simple API for XML)和DOM(Document Object Model)。SAX是流式解析,适用于处理大型XML文件;DOM则是将整个XML文档加载到内存,适合小型或中型文档...

    dom4j教程

    1. **XML解析**:DOM4J支持SAX和DOM两种解析方式。SAX是事件驱动的解析,适用于处理大型XML文档,因为它占用内存较少;DOM则是将整个XML文档加载到内存中形成一棵树,便于随机访问,适合小到中等规模的XML文件。 2....

    使用dom4j和jaxen解析xml

    在Java开发中,dom4j和jaxen是两个常用的库,用于解析和操作XML文档。 **dom4j** 是一个非常灵活且功能强大的Java XML API,它提供了全面的XML解决方案,包括XML的读取、写入、修改以及XPath查询等功能。dom4j的...

    DOM4J 解析XML

    在解析XML时,DOM4J有两种主要的解析方式:SAX和DOM。SAX是一种基于事件的解析器,适用于处理大型XML文档,因为它不会将整个文档加载到内存中。DOM,即文档对象模型,会构建一个完整的XML树,适合小型或中等大小的...

    xmldom4j解析

    与标准的DOM(Document Object Model)相比,DOM4J更轻量级,性能更优,并且在处理大型XML文档时内存占用更低。 二、XML解析方式 XML解析主要有两种方式:DOM(文档对象模型)和SAX(简单API for XML)。DOM解析会...

    dom4j jar包

    DOM4J提供两种解析方式:SAX和DOM。SAX解析器逐行读取XML文档,内存占用较小,适合处理大型XML文件;DOM解析器将整个XML文档加载到内存中,构建树形结构,适合小到中型文件。 ### 3. DOM4J操作XML - **创建XML文档...

    dom4j.jar包,java解析xml dom4j.jar包

    解析XML文件时,DOM4J提供了两种主要的方式:DOM阅读器和SAX阅读器。 - **DOM阅读器**:首先,通过`DocumentFactory.createDocument()`方法创建一个`Document`对象,然后使用`read()`方法读取XML文件,将整个XML...

    dom4j 中文版教程 pdf格式

    1. **XML解析**:DOM4J提供了两种解析XML的方式——DOM解析和SAX解析。DOM解析将整个XML文档加载到内存中,形成一个树形结构,适合小规模的XML文档;SAX解析则采用事件驱动模型,逐行读取XML,适用于大文件。 2. **...

    dom4j帮助文档chm(1.6.1)

    5. **SAX和DOM解析**: DOM4J同时支持SAX和DOM两种解析方式。SAX解析适用于大文件,因为它不需要一次性加载整个文档;DOM解析则将整个文档加载到内存,适合小文件或需要频繁访问的场景。 6. **事件驱动编程**: DOM4J...

    dom4j从基础到精通

    作为一款开源库,DOM4J在性能、功能和易用性上都有着出色的表现,这使得它在Java社区中得到了广泛应用,尤其在Hibernate等知名框架中被用来处理配置文件。\n\n### 一、DOM4J介绍\n\nDOM4J的核心接口主要集中在`org....

    dom4j-dom4j_1_6_1.tar.gz

    DOM4J 提供了两种主要的解析方法:SAX 和 DOM。SAX 是一种基于事件的解析方式,适用于处理大文件,而 DOM 则是将整个 XML 文件加载到内存中,适合处理小文件或对性能要求不高的场景。 - **SAX 解析**:通过 `...

    JAVA 解析XML 的JAr包 DOM4j.Jar JDOM.jar

    在Java编程语言中,...总结,Java中的XML解析有多种方法,DOM4j和JDOM是其中两个流行的库,它们都提供了方便的API来创建、读取、修改和写入XML文档。开发者可以根据项目的具体需求和性能要求,选择合适的XML解析库。

    dom4j 学习笔记

    - DOM4J提供了两种主要的解析方式:DOM解析和SAX解析。 - DOM解析会将整个XML文档加载到内存中,形成一个完整的文档对象模型,适合小型文档。 - SAX解析则是基于事件的,只在需要时读取文档部分,适用于处理大型...

    dom4j包和对应实体类包

    在Java世界里,DOM4J是仅次于JDOM的另一个广泛使用的XML处理工具,尤其在处理大型XML文档时,其性能表现优秀。 在给定的“dom4j包”中,我们可以推测它包含了DOM4J库的各种类和接口,这些可以帮助我们执行XML相关的...

    Dom4j jar.zip

    1. **解析XML文档**:Dom4j提供了两种解析方式,一是DOM解析,二是SAX解析。DOM解析会将整个XML文档加载到内存中,形成一个完整的树形结构;SAX解析则采用事件驱动的方式,逐个处理XML元素,节省内存但不支持随机...

    jdom+dom4j

    为了处理XML文件,Java开发者经常使用库如JDOM和DOM4J,这两个都是Java XML API的实现。本文将深入探讨JDOM和DOM4J,以及它们在解析XML时的应用。 **JDOM** JDOM,全称Java Document Object Model,是一个专为Java...

    DOM与DOM4J解析XML文档的详细讲解

    本文将深入探讨DOM(Document Object Model)和DOM4J两种XML解析技术,帮助你一次性全面掌握XML文档的解析过程。 一、DOM解析XML DOM,即文档对象模型,是W3C组织制定的一种解析XML的标准。它将XML文档转换为一个...

    dom4j相关jar和api

    5. **XPath**: DOM4J支持XPath表达式,这是一种强大的查询语言,可以用来快速定位XML文档中的特定节点。 6. **SAXReader / SAXWriter**: 这两个类分别用于读取和写入XML文档,它们基于SAX(Simple API for XML)...

Global site tag (gtag.js) - Google Analytics