tengo un documento de 1000 de entrada cuyo formato es algo así comoLa aceleración de XPath
<Example>
<Entry>
<n1></n1>
<n2></n2>
</Entry>
<Entry>
<n1></n1>
<n2></n2>
</Entry>
<!--and so on-->
Hay más de 1000 nodos de entrada aquí. Estoy escribiendo un programa Java que básicamente obtiene todos los nodos uno por uno y analiza algunos en cada nodo. Pero el problema es que el tiempo de recuperación de los nodos aumenta con su no. Por ejemplo, toma 78 milisegundos para recuperar el primer nodo 100 ms para recuperar el segundo y sigue aumentando. Y para recuperar el nodo 999 lleva más de 5 segundos. Esto es extremadamente lento Estaríamos conectando este código a archivos XML que tienen incluso más de 1000 entradas. Algunos como millones. El tiempo total para analizar el documento completo es de más de 5 minutos.
Estoy usando este código simple para recorrerlo. Aquí nxp
es mi propia clase que tiene todos los métodos para obtener nodos de xpath.
nxp.fromXpathToNode("/Example/Entry" + "[" + i + "]", doc);
y doc
es el documento para el archivo. i
es el no de nodo para recuperar.
también cuando intento algo como esto
List<Node> nl = nxp.fromXpathToNodes("/Example/Entry",doc);
content = nl.get(i);
que se enfrentan al mismo problema.
Cualquiera tiene alguna solución sobre cómo acelerar el tretirival de los nodos, por lo que toma el mismo tiempo para obtener el primer nodo y el nodo 1000 del archivo XML.
Gracias
Este es el código para 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);
}
}
y aquí está el código de 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;
}
y aquí está la puesta en
NativeXpathEngine clase pública implementa XpathEngine
{
fábrica XPathFactory final privado;
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>();
}
El código en '' fromXpathToNode' y fromXpathToNodes 'parece ser bastante relevante aquí. ¿Puedes proporcionar ese código? –
necesita ver su código que carga el documento. –
Si va a tocar cada entrada, ¿por qué usar XPath? –