У меня есть 1000 документов, формат которых выглядит примерно так:
<Example>
<Entry>
<n1></n1>
<n2></n2>
</Entry>
<Entry>
<n1></n1>
<n2></n2>
</Entry>
<!--and so on-->
Здесь более 1000 узлов входа. Я пишу Java-программу, которая в основном получает все узлы один за другим и проводит анализ каждого узла. Но проблема в том, что время поиска узлов увеличивается с его нет. Например, для извлечения первого узла требуется 78 миллисекунд, а для извлечения второго - 100 мс, и он продолжает увеличиваться. И для получения узла 999 требуется более 5 секунд. Это очень медленно. Мы будем подключать этот код к XML-файлам, которые содержат даже более 1000 записей. Некоторым нравятся миллионы. Общее время анализа всего документа составляет более 5 минут.
Я использую этот простой код для его обхода. Здесь nxp
- мой собственный класс, в котором есть все методы для получения узлов из xpath.
nxp.fromXpathToNode("/Example/Entry" + "[" + i + "]", doc);
и doc
- документ для файла. i
- это номер узла для извлечения.
Также, когда я пытаюсь что-то вроде этого
List<Node> nl = nxp.fromXpathToNodes("/Example/Entry",doc);
content = nl.get(i);
У меня такая же проблема.
У каждого есть какое-либо решение о том, как ускорить третичное сравнение узлов, поэтому для получения 1-го узла, а также 1000-го узла из файла XML требуется одинаковое количество времени.
Спасибо
вот код для 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);
}
}
и вот код для xpathtonodes.
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;
}
а вот и начало
открытый класс NativeXpathEngine реализует XpathEngine
{
закрытый финальный завод XPathFactory;
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>();
}