0

我有一个解析器,它解析和收集所需的字段并从中构造一个对象。假设如果 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 = (Node)xPath.evaluate(Name,xml,XPathConstants.NODE) 处获取节点值;

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

我可以在这里遗漏一些东西吗?谢谢!

4

2 回答 2

0

问题已经解决了。主要问题是以下链接中提到的问题。 XPath.evaluate 性能在多次调用中减慢(荒谬地)

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

于 2013-11-08T11:09:40.757 回答
0

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

于 2013-11-07T07:28:25.323 回答