gpt4 book ai didi

java - 加速 xpath

转载 作者:太空狗 更新时间:2023-10-29 22:34:17 29 4
gpt4 key购买 nike

我有一个包含 1000 个条目的文档,其格式类似于:

<Example>
<Entry>
<n1></n1>
<n2></n2>
</Entry>
<Entry>
<n1></n1>
<n2></n2>
</Entry>
<!--and so on-->

这里有1000多个Entry节点。我正在编写一个 Java 程序,它基本上是一个一个地获取所有节点并对每个节点进行一些分析。但问题是节点的检索时间随着其数量的增加而增加。例如,检索第一个节点需要 78 毫秒,检索第二个节点需要 100 毫秒,并且它还在不断增加。并且检索 999 节点需要超过 5 秒。这非常慢。我们会将此代码插入到包含 1000 多个条目的 XML 文件中。有些像数百万。解析整个文档的总时间超过 5 分钟。

我正在使用这个简单的代码来遍历它。这里 nxp 是我自己的类,它具有从 xpath 获取节点的所有方法。

nxp.fromXpathToNode("/Example/Entry" + "[" + i  + "]", doc);    

doc 是文件的文档。 i 是要检索的节点号。

还有当我尝试这样的事情时

List<Node> nl = nxp.fromXpathToNodes("/Example/Entry",doc);  
content = nl.get(i);

我遇到了同样的问题。

任何人都有关于如何加速节点更新的任何解决方案,因此从 XML 文件中获取第一个节点和第 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>();
}

最佳答案

尝试 VTD-XML .它比 DOM 使用更少的内存。它比 SAX 更易于使用并且支持 XPath。下面是一些示例代码,可帮助您入门。它应用 XPath 来获取 Entry 元素,然后打印出 n1 和 n2 子元素。

final VTDGen vg = new VTDGen();
vg.parseFile("/path/to/file.xml", false);

final VTDNav vn = vg.getNav();
final AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("/Example/Entry");
int count = 1;
while (ap.evalXPath() != -1) {
System.out.println("Inside Entry: " + count);

//move to n1 child
vn.toElement(VTDNav.FIRST_CHILD, "n1");
System.out.println("\tn1: " + vn.toNormalizedString(vn.getText()));

//move to n2 child
vn.toElement(VTDNav.NEXT_SIBLING, "n2");
System.out.println("\tn2: " + vn.toNormalizedString(vn.getText()));

//move back to parent
vn.toElement(VTDNav.PARENT);
count++;
}

关于java - 加速 xpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2365208/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com