加快 xpath
2022-09-02 10:16:07
我有一个1000个条目文档,其格式如下:
<Example>
<Entry>
<n1></n1>
<n2></n2>
</Entry>
<Entry>
<n1></n1>
<n2></n2>
</Entry>
<!--and so on-->
这里有 1000 多个入口节点。我正在编写一个Java程序,它基本上可以逐个获取所有节点,并对每个节点进行一些分析。但问题是节点的检索时间随着其no的增加而增加。例如,检索第一个节点需要78毫秒,检索第二个节点需要100毫秒,并且它不断增加。要检索 999 节点,需要 5 秒以上。这是非常缓慢的。我们将此代码插入到甚至有超过1000个条目的XML文件中。有些人喜欢数百万人。分析整个文档的总时间超过 5 分钟。
我正在使用这个简单的代码来遍历它。这是我自己的类,它具有从xpath获取节点的所有方法。nxp
nxp.fromXpathToNode("/Example/Entry" + "[" + i + "]", doc);
并且是文件的文档。 是要检索的节点的编号。doc
i
另外,当我尝试这样的事情时
List<Node> nl = nxp.fromXpathToNodes("/Example/Entry",doc);
content = nl.get(i);
我面临同样的问题。
任何人都有任何关于如何加速节点的重试的解决方案,因此从XML文件中获取第1个节点和1000个节点需要相同的时间。
这是 xpathtonode 的代码。
public Node fromXpathToNode(String expression, Node context)
{
try
{
return (Node)this.getCachedExpression(expression).evaluate(context, XPathConstants.NODE);
}
catch (Exception cause)
{
throw new RuntimeException(cause);
}
}
这是 fromxpathtonodes 的代码。
public List<Node> fromXpathToNodes(String expression, Node context)
{
List<Node> nodes = new ArrayList<Node>();
NodeList results = null;
try
{
results = (NodeList)this.getCachedExpression(expression).evaluate(context, XPathConstants.NODESET);
for (int index = 0; index < results.getLength(); index++)
{
nodes.add(results.item(index));
}
}
catch (Exception cause)
{
throw new RuntimeException(cause);
}
return nodes;
}
这是开始
public class NativeXpathEngine implements XpathEngine
{
private final XPathFactory factory;
private final XPath engine;
/**
* Cache for previously compiled XPath expressions. {@link XPathExpression#hashCode()}
* is not reliable or consistent so use the textual representation instead.
*/
private final Map<String, XPathExpression> cachedExpressions;
public NativeXpathEngine()
{
super();
this.factory = XPathFactory.newInstance();
this.engine = factory.newXPath();
this.cachedExpressions = new HashMap<String, XPathExpression>();
}