2009-04-30 13 views

Respuesta

1

convertir esta cadena en un objeto DOM y visitar los nodos:

Document dom= DocumentBuilderFactory().newDocumentBuilder().parse(new InputSource(new StringReader(myxml))); 
Element root= dom.getDocumentElement(); 
for(Node n=root.getFirstChild();n!=null;n=n.getNextSibling()) 
{ 
System.err.prinlnt("Current node is:"+n); 
} 
27

XPath usando Java 1.5 y superior, sin dependencias externas:

String xml = "<resp><status>good</status><msg>hi</msg></resp>"; 

XPathFactory xpathFactory = XPathFactory.newInstance(); 
XPath xpath = xpathFactory.newXPath(); 

InputSource source = new InputSource(new StringReader(xml)); 
String status = xpath.evaluate("/resp/status", source); 

System.out.println("satus=" + status); 
+3

No se ve muy simple ;-) –

+1

Sí, estoy de acuerdo con Peter, esta no es la forma * más simple *. Lo bueno aquí es mostrar cómo hacerlo usando JDK puro sin libretas externas. Una forma un poco más simple: http://stackoverflow.com/questions/807418/simplest-way-to-query-xml-in-java/831595#831595 – Jonik

+0

Sí, incluso las tareas simples que usan las bibliotecas estándares Java XML muestran todo demasiado claro que los autores han leído el libro de GoF. Pero, según la aplicación, la administración de bibliotecas de terceros puede crear una serie de complicaciones diferentes. – McDowell

2

Después Has terminado con formas simples de consultar XML en Java. Mira XOM.

7

Usando dom4j, similar a McDowell's solution:

String myxml = "<resp><status>good</status><msg>hi</msg></resp>"; 

Document document = new SAXReader().read(new StringReader(myxml)); 
String status = document.valueOf("/resp/msg"); 

System.out.println("status = " + status); 

manejo de XML es un poco más simple usando dom4j. Y varias otras bibliotecas XML comparables exist. Las alternativas a dom4j son discussed here.

6

Aquí es ejemplo de cómo hacer eso con XOM:

String myxml = "<resp><status>good</status><msg>hi</msg></resp>"; 

Document document = new Builder().build(myxml, "test.xml"); 
Nodes nodes = document.query("/resp/status"); 

System.out.println(nodes.get(0).getValue()); 

me gusta XOM más de dom4j por su simplicity and correctness. XOM no le permitirá crear XML no válido incluso si quieres ;-) (por ejemplo, con caracteres no válidos en los datos de caracteres)

+0

Hmm, bueno, esto se ve simple ... Pero para facilitar la comparación, ¿podría editarla para que funcione exactamente como las soluciones de McDowell y de mí? :) Supongo que necesitarías agregar una línea o tres. – Jonik

+0

Ok, ha cambiado ahora ;-) Tienes razón ... obtener el valor de cadena de todos los nodos devueltos requiere jugar con los índices. No entiendo por qué no hay ningún método Nodes.getValue() para devolver el valor de cadena de todos los nodos devueltos. (También 'engañé' con el nuevo Builder(). Build (...) ;-) pero ustedes también tienen cadenas similares en su código). –

+0

Gracias. Tienes razón sobre el encadenamiento :) Pero sí, esto todavía está bastante limpio, en gran parte gracias a Builder(). Build(). Ahora, si solo pudiera hacer algo como document.valueOf (xpath) en dom4j ... +1 – Jonik

1

@The Comentarios de esta answer:

Puede crear un método para que se vea más simple

String xml = "<resp><status>good</status><msg>hi</msg></resp>"; 

System.out.printf("satus= %s\n", getValue("/resp/status", xml)); 

La aplicación:

public String getValue(String path, String xml) { 
    return XPathFactory 
       .newInstance() 
       .newXPath() 
       .evaluate(path , new InputSource(
           new StringReader(xml))); 

} 
+0

Claro, pero también en las soluciones más simples (http://stackoverflow.com/questions/807418/simplest-way-to- query-xml-in-java/831623 # 831623, http://stackoverflow.com/questions/807418/simplest-way-to-query-xml-in-java/831595#831595) podrías crear métodos de ayuda para hacerlos ¡aún más simple! (Por ejemplo, si realmente estuviera codificando esto (en el trabajo), usaría XMLUtils.readFromString (String xml) que retoma el documento, en lugar de las cosas de SAXReader que utilicé en mi respuesta). – Jonik

0

Aquí es un fragmento de código de consultar el código XML con VTD-XML

import com.ximpleware.*; 
public class simpleQuery { 

    public static void main(String[] s) throws Exception{ 
     String myXML="<resp><status>good</status><msg>hi</msg></resp>"; 
     VTDGen vg = new VTDGen(); 
     vg.setDoc(myXML.getBytes()); 
     vg.parse(false); 
     VTDNav vn = vg.getNav(); 
     AutoPilot ap = new AutoPilot(vn); 
     ap.selectXPath("/resp/status"); 
     int i = ap.evalXPath(); 
     if (i!=-1) 
      System.out.println(" result ==>"+vn.toString(i)); 
    } 
} 
Cuestiones relacionadas