XPathExpression no evaluatng en el contexto adecuado?
Estoy tratando de analizar algunos XML de la USGS.
Aquí está un ejemplo
- Buscar en archivo XML con XPath en Android
- Analizando XMl en Android usando Xpath
- "TransformerException: se esperaba un paso de ubicación" en android xpath
- Appium: ¿No se pudo localizar un elemento utilizando Xpath en aplicaciones híbridas android?
- Cómo poner elementos anidados de archivo XML a la lista de objetos con VTD-XML parser?
El parámetro "parameterCd" enumera los 3 elementos de datos que quiero volver. Puedo o no puedo recuperar todos los 3.
Estoy haciendo esto en un Android usando las bibliotecas javax.
En mi código, inicialmente recuperar los nodos 0-3 ns1: timeSeries. Esto funciona bien. Lo que entonces quiero hacer es, en el contexto de un único nodo timeSeries, recuperar los nodos ns1: variable y ns1: values.
Así que en mi código abajo donde tengo:
expr = xpath.compile("//ns1:variable"); NodeList variableNodes = (NodeList) expr.evaluate(timeSeriesNode, XPathConstants.NODESET);
Yo esperaría sólo recuperar un nodo, ya que la evaluación DEBE estar sucediendo en el contexto de la única timeSeriesNode que estoy pasando en (de acuerdo con la documentación ). Sin embargo, en su lugar, devuelve todos los nodos ns1: variable del documento.
¿Me estoy perdiendo de algo?
Aquí están las porciones relevantes …
XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); xpath.setNamespaceContext(new InstantaneousValuesNamespaceContext()); XPathExpression expr; NodeList timeSeriesNodes = null; InputStream is = new ByteArrayInputStream(sourceXml.getBytes()); try { expr = xpath.compile("//ns1:timeSeries"); timeSeriesNodes = (NodeList) expr.evaluate(new InputSource(is), XPathConstants.NODESET); for(int timeSeriesIndex = 0;timeSeriesIndex < timeSeriesNodes.getLength(); timeSeriesIndex++){ Node timeSeriesNode = timeSeriesNodes.item(timeSeriesIndex); expr = xpath.compile("//ns1:variable"); NodeList variableNodes = (NodeList) expr.evaluate(timeSeriesNode, XPathConstants.NODESET); // Problem here. I've got all the variables, not the individual one I want. for(int variableIndex = 0; variableIndex < variableNodes.getLength(); variableIndex++){ Node variableNode = variableNodes.item(variableIndex); expr = xpath.compile("//ns1:valueType"); NodeList valueTypeNodes = (NodeList) expr.evaluate(variableNode, XPathConstants.NODESET); } } } catch (XPathExpressionException e) { // TODO Auto-generated catch block e.printStackTrace(); }
- Error desconocido en xpath (utilizando xmlpullparser)
- No se puede encontrar el elemento que utiliza xpath con Appium (estructura de robot)
- Texto del atributo xpath de Appium
- Quiero usar Xpath en Android para analizar XML
- Necesidad de identificar xpath para el elemento android usando appium
- Cómo encontrar xpath en una aplicación para móviles usando appium
- XPath.Evaluar el rendimiento se ralentiza (absurdamente) en varias llamadas
- ¿Cómo puedo obtener nodos específicos de XML usando XPath en Java?
Trate de cambiar
//ns1:variable
a
.//ns1:variable
A pesar de que, como dicen los documentos, la expresión se evalúa dentro del contexto del nodo actual, //
es especial y (a no ser que se modifique) siempre significa "buscar todo el documento desde la raíz". Poniendo el .
En, usted fuerza el significado que usted quiere, "busca el árbol entero de este punto hacia abajo".