2009-04-30 18 views

Odpowiedz

1

przekonwertować ten ciąg do obiektu DOM i odwiedzić węzły:

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 używając Java 1.5 lub nowszej, bez zależności zewnętrzne:

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

Nie wygląda zbyt prosto ;-) –

+1

Tak, zgadzam się z Piotrem, to nie jest najprostsza * droga. Dobrą rzeczą w tym przypadku jest pokazanie, jak to zrobić, używając czystego JDK bez zewnętrznych bibliotek. Jeden prostszy sposób: http://stackoverflow.com/questions/807418/simplest-way-to-query-xml-in-java/831595#831595 – Jonik

+0

Tak, nawet proste zadania korzystające ze standardowych bibliotek XML XML pokazują wszystko zbyt wyraźnie, że autorzy przeczytali książkę GoF. Ale w zależności od aplikacji zarządzanie bibliotekami innych firm może stworzyć wiele różnych komplikacji. – McDowell

2

Po twoja robota za pomocą prostych sposobów na zapytanie XML w java. Spójrz na XOM.

7

Korzystanie dom4j, podobny do 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); 

obsługa XML jest nieco prostsze przy użyciu dom4j. I kilka innych porównywalnych bibliotek XML exist. Alternatywy dla dom4j to discussed here.

6

Oto przykład jak to zrobić z 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()); 

Lubię Xóm ponad dom4j jego simplicity and correctness. XOM nie pozwoli Ci stworzyć nieprawidłowy XML, nawet jeśli chcesz ;-) (np nielegalnych znaków w danych znaków)

+0

Hmm, ładnie, to wygląda na proste ... Ale żeby łatwiej było porównywać, czy mógłbyś edytować go tak, by działał dokładnie tak samo, jak McDowell i ja? :) Myślę, że musisz dodać linię lub trzy. – Jonik

+0

OK, zmieniło się to teraz ;-) Masz rację ... uzyskanie wartości łańcuchowej wszystkich zwróconych węzłów wymaga gry z indeksami. Nie rozumiem, dlaczego nie ma metody Nodes.getValue() zwracającej wartość ciągu wszystkich zwróconych węzłów. (Ja też "oszukiwałem" z nowym Builderem(). Build (...) ;-) ale macie też podobne łańcuchy w swoim kodzie). –

+0

Dzięki. Masz rację co do łączenia łańcuchów :) Ale tak, to wciąż jest całkiem czyste, głównie dzięki Builder(). Build(). Teraz, gdybyś mógł zrobić coś takiego jak document.valueOf (xpath) w dom4j ... +1 – Jonik

1

@The komentarzy dotyczących tego answer:

można stworzyć metodę, aby wyglądać prostsze

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

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

realizacja:

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

} 
+0

Oczywiście, ale także w prostszych rozwiązaniach (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) Można utworzyć metody pomocnicze, aby je utworzyć jeszcze prostsze! (Na przykład, gdybym naprawdę kodował to (w pracy), użyłbym XMLUtils.readFromString (String xml), który zwróci dokument, zamiast tych rzeczy, których użyłem w odpowiedzi.) – Jonik

0

Oto fragment kodu od sprawdzania Twojego XML z 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)); 
    } 
} 
Powiązane problemy