2009-04-30 4 views
14

J'ai de petites chaînes avec XML, comme:façon d'interroger Simplest XML en Java

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

que je veux interroger pour obtenir leur contenu.

Quelle serait la façon la plus simple de faire cela?

Répondre

1

convertir cette chaîne dans un objet DOM et de visiter les nœuds:

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 utilisant Java 1.5 et au-dessus, sans dépendances externes:

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

Ça n'a pas l'air très simple ;-) –

+1

Ouais, je suis d'accord avec Peter, ce n'est pas du tout la * façon la plus simple. La bonne chose ici est de montrer comment le faire en utilisant JDK pur sans librairies externes. Un peu plus simple: http://stackoverflow.com/questions/807418/simplest-way-to-query-xml-in-java/831595#831595 – Jonik

+0

Oui, même les tâches simples qui utilisent les bibliothèques Java XML standards montrent tout trop clairement que les auteurs ont lu le livre du GoF. Mais, selon l'application, la gestion des bibliothèques tierces peut créer une foule de complications différentes. – McDowell

2

Après votre fait avec des moyens simples de requête XML en Java. Regardez XOM.

7

En utilisant dom4j, semblable à 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); 

traitement XML est un peu plus simple en utilisant dom4j. Et plusieurs autres bibliothèques XML comparables exist. Les alternatives à dom4j sont discussed here.

6

Voici exemple de la façon de le faire avec 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()); 

J'aime XOM plus dom4j pour son simplicity and correctness. XOM ne vous laissera pas créer XML non valide même si vous voulez ;-) (par exemple avec des caractères illégaux dans les données de caractères)

+0

Hmm, bien, cela semble simple ... Mais juste pour faciliter la comparaison, pourriez-vous l'éditer pour fonctionner exactement comme les solutions de McDowell et moi? :) Je suppose que vous auriez besoin d'ajouter une ligne ou trois. – Jonik

+0

Ok, ça a changé maintenant ;-) Vous avez raison ... obtenir la valeur de chaîne de tous les nœuds renvoyés nécessite de jouer avec des index. Je ne comprends pas pourquoi il n'y a pas de méthode Nodes.getValue() pour retourner la valeur de chaîne de tous les nœuds retournés. (J'ai aussi triché avec new Builder(). Build (...) ;-) mais vous avez aussi des chaînes similaires dans votre code). –

+0

Merci. Vous avez raison sur le chaînage :) Mais oui, c'est toujours assez propre, en grande partie grâce à Builder(). Build(). Maintenant, si seulement vous pouviez faire quelque chose comme document.valueOf (xpath) dans dom4j ... +1 – Jonik

1

@the commentaires de cette answer:

Vous pouvez créer une méthode pour le faire paraître plus simple

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

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

La mise en œuvre:

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

} 
+0

Bien sûr, mais aussi dans les solutions plus 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) vous pouvez créer des méthodes d'aide pour les faire encore plus simple! (Par exemple, si je codais vraiment ceci (au travail), j'utiliserais XMLUtils.readFromString (String xml) qui retient Document, au lieu de ce truc SAXReader que j'ai utilisé dans ma réponse.) – Jonik

0

Voici un extrait de code de interrogation de votre XML avec 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)); 
    } 
}