解析xml,指数增加的时间

时间:2013-11-07 07:20:01

标签: java xml xpath xml-parsing

我有一个解析器,它解析并收集require字段并从中构造一个对象。 假设xml如下所示

<xml>
<p1>
...
...
</p1>
<p2>
...
</p2>
...
...
</xml>

我的java代码解析它,代码如下所示。

for each product //p1,p2 etc..
 print start time
 parse that node, which returns a object
 print end time
 add the object to list.

示例代码位于

之下
products = (NodeList) xPath.evaluate("/xml/product",pxml,XPathConstants.NODESET);
for (int i = 0; i < products.getLength(); i++)
            {
                System.out.println("parsing product ::"+i+":" + (System.currentTimeMillis()-time));
                BookDataInfo _parsedPoduct = ParseProduct(products.item(i));
                System.out.println("parsing product finished ::"+i+":" + (System.currentTimeMillis()-time));
                if (_parsedPoduct.getParsingSucceeded())
                {
                    pparsedProducts.add(_parsedPoduct);
                }
            }

我在解析节点之前打印了时间,之后,时间呈指数级增长,第一个产品的产品数量需要100毫秒,而第300个产品需要2000毫秒。 在每种情况下,执行相同的代码部分以进行解析。 任何人都知道为什么会这样吗?

我不能发布代码是什么parseproduct正在做什么,但发现时间消耗最多的地方。

private NodeList getNodelist(Node xml, String Name)
{
    long time = System.currentTimeMillis();
    System.out.println("Nodelist start::" + (System.currentTimeMillis() - time));
    NodeList nodes = (NodeList)xPath.evaluate(Name,xml,XPathConstants.NODESET);
    System.out.println("Nodelist end::" + (System.currentTimeMillis() - time));
    return nodes;
}

类似于在stmt获取节点值 节点node =(Node)xPath.evaluate(Name,xml,XPathConstants.NODE);

这里xPath是XPath类型的静态对象。 当多次为产品调用上述功能时,后面的调用需要花费很多时间,比如在开始时需要2/3 ms但稍后(比如产品300)每次调用需要55-60ms。

我可能在这里错过一些东西吗? 谢谢!

2 个答案:

答案 0 :(得分:0)

查看DOM和SAX解析之间的区别,DOM允许您查询XML文件,但必须将整个文档上传到内存中,如果您只想创建对象,最好使用SAX解析器

答案 1 :(得分:0)

问题解决了。 主要问题是下面链接中提到的问题。 XPath.evaluate performance slows down (absurdly) over multiple calls

按照上面提到的步骤,它大大减少了消耗的时间。