XPath con espacio de nombres en Java

Me gustaría obtener todo el contenido entre las tags, pero no sé cómo hacerlo debido a la urna: espacio de nombres.

 /CAMERA/Streaming/status 4 Invalid Operation 0  

Algunas ideas ?

Gracias !

  1. Respuesta corta: use XPath local-name() . De esta manera: xPathFactory.newXPath().compile("//*[local-name()='requestURL']/text()"); volverá /CAMERA/Streaming/status
  2. O bien, puede implementar un NamespaceContext que correlacione nombres de espacios de nombres y URI y lo configure en el objeto XPath antes de consultar.
  3. Echa un vistazo a este artículo de blog , Actualización: el artículo está inactivo, puedes verlo en webarchive

Muestra de la solución 1:

 XPath xpath = XPathFactory.newInstance().newXPath(); String responseStatus = xpath.evaluate("//*[local-name()='ResponseStatus']/text()", document); System.out.println("-> " + responseStatus); 

Muestra de la solución 2:

 // load the Document Document document = ...; NamespaceContext ctx = new NamespaceContext() { public String getNamespaceURI(String prefix) { return prefix.equals("urn") ? "urn:camera-org" : null; } public Iterator getPrefixes(String val) { return null; } public String getPrefix(String uri) { return null; } }; XPath xpath = XPathFactory.newInstance().newXPath(); xpath.setNamespaceContext(ctx); String responseStatus = xpath.evaluate("//urn:ResponseStatus/text()", document); System.out.println("-> " + responseStatus); 

Editar

Este es un ejemplo completo, recupera correctamente el elemento:

 String xml = "\r\n" + // "\r\n" + // "/CAMERA/Streaming/status\r\n" + // "4\r\n" + // "Invalid Operation\r\n" + // "0\r\n" + // "\r\n" + // ""; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new java.io.ByteArrayInputStream(xml.getBytes())); XPath xpath = XPathFactory.newInstance().newXPath(); xpath.setNamespaceContext(new NamespaceContext() { public String getNamespaceURI(String prefix) { return prefix.equals("urn") ? "urn:camera-org" : null; } public Iterator< ?> getPrefixes(String val) { return null; } public String getPrefix(String uri) { return null; } }); XPathExpression expr = xpath.compile("//urn:ResponseStatus"); Object result = expr.evaluate(doc, XPathConstants.NODESET); NodeList nodes = (NodeList) result; for (int i = 0; i < nodes.getLength(); i++) { Node currentItem = nodes.item(i); System.out.println("found node -> " + currentItem.getLocalName() + " (namespace: " + currentItem.getNamespaceURI() + ")"); } 

XML xpath con espacio de nombres

Simple XML

 String namespaceXML = "< ?xml version='1.0' ?>Deep34Male Kumar24Male Deepali19Female"; String jsonString = "{}"; String expression = "//information"; 

Espacio de nombre XML

 String namespaceXML = "nine hundred and ninety nine dollars"; String jsonString = "{'soap':'http://schemas.xmlsoap.org/soap/envelope/', 'm':'http://www.dataaccess.com/webservicesserver/'}"; String expression = "//m:NumberToDollarsResponse/m:NumberToDollarsResult/text()"; 

Proporcione el archivo xml del espacio de nombres como una cadena, al asscerionXpath(namespaceXML, jsonString, expression) y obtenga el resultado en forma de texto / nodo.

texto (): nine hundred and ninety nine dollars

nodo: nine hundred and ninety nine dollars

 public static String asscerionXpath(String namespaceXML, String jsonString, String expression){ if(namespaceXML.indexOf(">< ") > -1) namespaceXML = namespaceXML.replace(">< ", ">\r\n< "); if(jsonString.indexOf("'") > -1) jsonString = jsonString.replace("'", "\""); System.out.println("namespaceXML : \n"+namespaceXML); System.out.println("nsmespaces : \n"+jsonString); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(false); factory.setNamespaceAware(true); factory.setIgnoringComments(true); factory.setIgnoringElementContentWhitespace(true); try { DocumentBuilder builder = factory.newDocumentBuilder(); Document source = builder.parse( string2Source(namespaceXML) ); XPath xpath = XPathFactory.newInstance().newXPath(); addNameSpaces(jsonString, xpath); // An XPath expression is not thread-safe. Make sure it is accessible by only one Thread. XPathExpression expr = xpath.compile(expression); // The NodeList interface provides the abstraction of an ordered collection of nodes, NodeList nodes = (org.w3c.dom.NodeList) expr.evaluate(source, XPathConstants.NODESET);; Node tree_base = nodes.item(0); return document2String(tree_base); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (XPathExpressionException e) { System.out.println("If the expression cannot be evaluated."); } return ""; } static InputSource string2Source( String str ) { InputSource inputSource = new InputSource( new StringReader( str ) ); return inputSource; } static void addNameSpaces(String jsonString, XPath xpath) { JSONParser parser = new JSONParser(); try { JSONObject namespaces = (JSONObject) parser.parse(jsonString); if (namespaces.size() > 0) { final JSONObject declaredPrefix = namespaces; // To access in Inner-class. NamespaceContext nameSpace = new NamespaceContext() { // To get all prefixes bound to a Namespace URI in the current scope, XPath 1.0 specification // --> "no prefix means no namespace" public String getNamespaceURI(String prefix) { Iterator< ?> key = declaredPrefix.keySet().iterator(); System.out.println("Keys : "+key.toString()); while (key.hasNext()) { String name = key.next().toString(); if (prefix.equals(name)) { System.out.println(declaredPrefix.get(name)); return declaredPrefix.get(name).toString(); } } return ""; } public Iterator< ?> getPrefixes(String val) { return null; } public String getPrefix(String uri) { return null; } };// Inner class. xpath.setNamespaceContext( nameSpace ); } } catch ( org.json.simple.parser.ParseException e) { e.printStackTrace(); } }