mam małe Strings z XML, takich jak:Najprostszy sposób do kwerendy XML w Javie
String myxml = "<resp><status>good</status><msg>hi</msg></resp>";
który chcę zapytać, aby uzyskać ich zawartość.
Jaki byłby najprostszy sposób to zrobić?
mam małe Strings z XML, takich jak:Najprostszy sposób do kwerendy XML w Javie
String myxml = "<resp><status>good</status><msg>hi</msg></resp>";
który chcę zapytać, aby uzyskać ich zawartość.
Jaki byłby najprostszy sposób to zrobić?
można spróbować JXPath
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);
}
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);
Po twoja robota za pomocą prostych sposobów na zapytanie XML w java. Spójrz na XOM.
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.
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)
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
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). –
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
@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)));
}
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
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));
}
}
Nie wygląda zbyt prosto ;-) –
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
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