2009-04-30 4 views
14

Ich habe kleine Strings mit XML, wie:einfachste Weg, XML abfragen in Java

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

die ich abfragen möchten, um ihre Inhalte zu bekommen.

Was wäre der einfachste Weg, dies zu tun?

Antwort

1

convert diese Zeichenfolge in ein DOM-Objekt und besuchen Sie die Knoten:

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 mit Java 1.5 und höher, ohne externe Abhängigkeiten:

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

Sieht nicht sehr einfach aus ;-) –

+1

Ja, ich stimme Peter zu, das ist kaum der * einfachste * Weg. Die gute Sache hier ist zu zeigen, wie man es mit reinem JDK ohne externe Bibliotheken macht. Ein etwas einfacherer Weg: http://stackoverflow.com/questions/807418/simplet-way-to-query-xml-in-java/831595#831595 – Jonik

+0

Ja, selbst einfache Aufgaben, die die Standard-Java-XML-Bibliotheken verwenden, zeigen alle zu deutlich, dass die Autoren das GoF-Buch gelesen haben. Je nach Anwendung kann die Verwaltung von Drittanbieterbibliotheken jedoch eine Vielzahl unterschiedlicher Komplikationen verursachen. – McDowell

2

Nach Ihre getan mit einfachen Möglichkeiten, XML in Java abzufragen. Schau dir XOM an.

7

Mit dom4j ähnlich 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); 

XML-Handling ist ein bisschen einfacher dom4j verwenden. Und einige andere vergleichbare XML-Bibliotheken exist. Alternativen zu dom4j sind discussed here.

6

Hier ist Beispiel dafür, wie man das mit 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()); 

Ich mag XOM mehr als dom4j für seine simplicity and correctness. XOM lassen Sie nicht ungültige XML erstellen, auch wenn Sie zu ;-) wollen (zB mit ungültigen Zeichen in Zeichendaten)

+0

Hmm, schön, das sieht einfach aus ... Aber um Vergleiche einfacher zu machen, könntest du es vielleicht so bearbeiten, dass es genauso funktioniert wie die Lösungen von McDowell und mir? :) Ich denke, Sie müssten eine oder drei Zeilen hinzufügen. – Jonik

+0

Ok, es hat sich jetzt geändert ;-) Du hast recht ... das Abrufen des String-Wertes aller zurückgegebenen Knoten erfordert etwas Spiel mit Indizes. Ich verstehe nicht, warum es keine Nodes.getValue() -Methode gibt, um den String-Wert aller zurückgegebenen Knoten zurückzugeben. (Ich habe auch mit dem neuen Builder() getäuscht. Build (...) ;-) aber ihr habt auch ähnliche Ketten in eurem Code). –

+0

Danke. Du hast recht mit der Verkettung :) Aber ja, das ist immer noch ziemlich sauber, größtenteils dank Builder(). Build(). Nun, wenn du nur etwas wie document.valueOf (xpath) in dom4j machen könntest ... +1 – Jonik

1

@The Kommentare dieser answer:

Sie eine Methode erstellen, um es so aussehen,

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

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

Die Umsetzung:

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

} 
+0

Sicher, aber auch in den einfacheren Lösungen (http://stackoverflow.com/questions/807418/simplet-way-to- query-xml-in-java/831623 # 831623, http://stackoverflow.com/questions/807418/simplet-way-to-query-xml-in-java/831595#831595) Sie könnten Hilfsmethoden erstellen, um sie zu erstellen noch einfacher! (Zum Beispiel, wenn ich das wirklich (bei der Arbeit) kodiere, würde ich XMLUtils.readFromString (String xml) verwenden, was Document zurückholt, anstatt das SAXReader-Zeug, das ich in meiner Antwort verwendet habe.) – Jonik

0

Hier ist ein Code-snippet Ihre XML von Abfragen mit 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)); 
    } 
} 
Verwandte Themen