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