Mam dokument 1000 wejścia, którego format jest cośPrzyspieszenie XPath
<Example>
<Entry>
<n1></n1>
<n2></n2>
</Entry>
<Entry>
<n1></n1>
<n2></n2>
</Entry>
<!--and so on-->
Istnieje ponad 1000 węzłów kwalifikacyjne tutaj. Piszę program w języku Java, który pobiera po kolei wszystkie węzły i analizuje je w każdym węźle. Problem polega jednak na tym, że czas pobierania węzłów rośnie wraz z jego nie. Na przykład potrzeba 78 milisekund, aby pobrać pierwszy węzeł 100 ms, aby pobrać drugi i stale rośnie. A odzyskanie węzła 999 zajmuje więcej niż 5 sekund. To jest bardzo powolne. Będziemy podłączać ten kod do plików XML, które mają nawet ponad 1000 wpisów. Niektórzy lubią miliony. Łączny czas przeanalizowania całego dokumentu wynosi więcej niż 5 minut.
Używam tego prostego kodu do przechodzenia przez niego. Tutaj nxp
jest moją własną klasą, która ma wszystkie metody pobierania węzłów z xpath.
nxp.fromXpathToNode("/Example/Entry" + "[" + i + "]", doc);
i doc
jest dokumentem dla pliku. i
to nr węzła do pobrania.
Również gdy próbuję coś takiego
List<Node> nl = nxp.fromXpathToNodes("/Example/Entry",doc);
content = nl.get(i);
I twarz ten sam problem.
Każdy ma jakieś rozwiązanie, aby przyspieszyć tretirival węzłów, więc zajmuje tyle samo czasu, aby uzyskać pierwszy węzeł, a także 1000 węzeł z pliku XML.
Dziękuję
oto kod dla 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);
}
}
i tutaj jest kod dla odxpathtonodes.
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;
}
i oto począwszy
public class NativeXpathEngine realizuje XpathEngine
{
prywatny końcowy fabryczny 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>();
}
kodu w 'fromXpathToNode' i' fromXpathToNodes "wydaje się tutaj bardzo istotne. Czy możesz podać ten kod? –
trzeba zobaczyć kod, który ładuje dokument. –
Jeśli chcesz trafić w każdy wpis, po co używać XPath? –