XMl auslesen

  1. #1
    k_g


    XMl auslesen - Standard XMl auslesen
    Hallo ich hab eine xml dokument welches ich auslesen will
    das xml sieht wie folgt aus:
    [XML]<?xml version="1.0" encoding="utf-8"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
    <getMessungenAktuellResponse xmlns="http://pegelonline.wsv.de/webservices/version2_3/2007/10/31">

    <getMessungenAktuellReturn>
    <messwert>155.000</messwert>
    <tendenz>-99</tendenz>
    <zeitpunkt>2011-05-26T00:00:00.000Z</zeitpunkt>
    </getMessungenAktuellReturn>[/XML]

    in meinen java Code habe ich so angefangen jedoch bekomme ich nur fehler und es passiert nix. Weis jemand was ich falsch mache
    java code:
    Java Code:
    1.  
    2.  
    3. public class XML {
    4.  
    5. public static void main (String[]args) throws JDOMException
    6. {
    7. String filename = "response.xml";
    8. Document doc = new SAXBuilder().build( response.xml );
    9. Element getMessungenAktuellResponse = doc.getRootElement();
    10. List Antworten = MessungenAktuellResponse.getChildren( "getMessungenAktuellReturn" );
    11. String getraenk = Antworten.getChildText( "messwert" );
    12. }
    13. }

  2. #2
    geneticZ


    Hi,
    du musst die Liste mit einem Iterator durchlaufen und bei getChild den Namespace mit übergeben!
    Bei genauerer Betrachtung stimmt da einiges nicht...
    Java Code:
    1.  
    2. this.doc = new SAXBuilder().build(xmlFile);
    3. Element root = doc.getRootElement();
    4. Namespace ns = root.getNamespace();
    5. List<?> childList = root.getChildren();
    6. //Mit einem Iterator diese Liste durchlaufen
    7. Iterator<?> iter = childList.iterator();
    8. while (iter.hasNext()) {
    9. Element group = (Element)iter.next();
    10. Element groupHeader = group.getChild("GroupHeader", ns);
    11. }

  3. #3
    k_g


    ich mein mein code jetzt so geändert
    java code:
    Java Code:
    1.  
    2. import java.io.IOException;
    3. import java.util.Iterator;
    4. import java.util.List;
    5.  
    6. import org.jdom.Document;
    7. import org.jdom.Element;
    8. import org.jdom.JDOMException;
    9. import org.jdom.Namespace;
    10. import org.jdom.input.SAXBuilder;
    11.  
    12.  
    13. public class XML {
    14.  
    15. public static void main (String[]args) throws JDOMException, IOException
    16. {
    17. String filename = "E:\\Dokumente und Einstellungen\\konstantin.grinspon\\Desktop\\response.xml";
    18. Document doc = new SAXBuilder().build( filename );
    19. Element Envolpe = doc.getRootElement();
    20. Namespace ns = Envolpe.getNamespace();
    21.  
    22. Element Body = Envolpe.getChild("Body");
    23. Namespace ns1 = Body.getNamespace();
    24. List Anfrage = Body.getChildren( "getMessungenAktuellResponse" );
    25. List Antworten= Anfrage.getChildren("getMessungenAktuellReturn");
    26. Iterator<Element> i= Antworten.iterator();
    27. while(i.hasNext())
    28. {
    29. Element e= i.next();
    30. String messwert = e.getChildText( "messwert",ns1 );
    31. }
    32. }
    33. }


    es klappt treotzdem nicht besonders bei der List Antworten steht es ist ein fehler bei getChildren vorhanden (das er undifindet ist)

  4. #4
    eRaaaa


    Naja [C]Anfragen[/C] ist eine Liste, und kein [C]Element[/C] o.ä. da gibts keine Methode [C]getChildren[/C]!

    Du solltest vllt auch erst einmal anfangen genau zu erklären was du versuchst aus der XML-Datei zu extrahieren! Den/die Messwert/e oder wie?
    Probiers dann mal so
    Java Code:
    1.  
    2. String filename = "E:\\Dokumente und Einstellungen\\konstantin.grinspon\\Desktop\\response.xml";
    3. Document doc = new SAXBuilder().build(filename);
    4. Element envolpe = doc.getRootElement();
    5. Element body = envolpe.getChild("Body", envolpe.getNamespace());
    6. Namespace ns = Namespace.getNamespace("ns","http://pegelonline.wsv.de/webservices/version2_3/2007/10/31");
    7. List<Element> anfrage = body.getChildren("getMessungenAktuellResponse",ns);
    8. for (Element element : anfrage) {
    9. List<Element> antworten = element.getChildren("getMessungenAktuellReturn", ns);
    10. for (Element e : antworten) {
    11. String messwert = e.getChildText("messwert", ns);
    12. System.out.println(messwert.trim());
    13. }
    14. }


    (oder einfach XPath benutzen )

  5. #5
    k_g


    ja genau ich hab die messwerte versucht mir anzeigen zu lassen.
    Danke dir. War jetzt mein fehler nur darin, das Elemente die Methode getchildren nicht benutzen?und du hast es jetzt mit for schleife gemacht, hätte ich das auch mit der while von mir hinbekomen?
    ich weis nicht wie man mit xPath arbeitet...

  6. #6
    eRaaaa


    Zitat Zitat von k_g Beitrag anzeigen
    War jetzt mein fehler nur darin, das Elemente die Methode getchildren nicht benutzen?
    Nein, Element hat diese Methode, aber die Klasse/Interface List nicht! getChildren liefert eben eine Liste von Elementen. D.h. du musst eben nun über diese Liste iterieren und kannst dann auf jedem Element wiederum getChildren aufrufen (wenn du willst) aber eben nicht direkt auf der Liste!
    und du hast es jetzt mit for schleife gemacht, hätte ich das auch mit der while von mir hinbekomen?
    Ja natürlich!
    Java Code:
    1.  
    2. Iterator<Element> it = anfrage.iterator();
    3. while (it.hasNext()) {
    4. List<Element> antworten = it.next().getChildren("getMessungenAktuellReturn", ns);
    5. Iterator<Element> it2 = antworten.iterator();
    6. while (it2.hasNext()) {
    7. String messwert = it2.next().getChildText("messwert", ns);
    8. System.out.println(messwert.trim());
    9. }
    10. }

    ist aber gefährlicher und mehr Schreibarbeit
    ich weis nicht wie man mit xPath arbeitet...
    Mhm, das vereinfacht die Sache etwas, denn alles was du bräuchtest wäre
    Java Code:
    1.  
    2. String filename = "E:\\Dokumente und Einstellungen\\konstantin.grinspon\\Desktop\\response.xml";
    3. Document doc = new SAXBuilder().build(filename);
    4. XPath xpath = XPath.newInstance("//ns:messwert");
    5. xpath.addNamespace(Namespace.getNamespace("ns", "http://pegelonline.wsv.de/webservices/version2_3/2007/10/31"));
    6. Element messwert = (Element) xpath.selectSingleNode(doc.getRootElement());
    7. System.out.println(messwert.getValue().trim());

  7. #7
    k_g


    ok danke schön
    und jetzt habe ich noch eine frage zu der ich nicht unbedingt ein quellcode haben will sondern wissen will wie es Funktioniert.
    Also in meinen java code habe ich ja auf eine Datei zugegriffen die bei mir auf den pc abgespeichert ist. Das war eine Antwort XML auf eine XML-Anfrage von einer webseite. So jetzt will ich das ich diese anfrage durch mein Programm verschicke und dann die antwort so auslese wie die, die ich auf den pc habe.

  8. #8
    eRaaaa


    Naja die Methode build() nimmt eben nicht nur einen String an sondern auch eine URL! Oder eben Alternativ einen InputStream!! Das sollte dir helfen

    edit: scheint ja ein WebService mit einer wsdl zu sein, wieso benutzt du nicht einfach die und lässt dir den Client generieren? =)

  9. #9
    k_g


    ja aber das ist komplizierter. Den meine URL verweist auf eine XML. Und in dieser sind sehr viele verschiedene Parameter die aufgerufen werden können. (z.b. gewässer liste, messstellenliste...) Und ich muss nur auf eins davon zugreifen. Und ich muss nur auf die aktuellenmessungen zugreifen , und das auch nur von einem gewässer.
    hier ist die url wenn du das siehst kannst du vielleicht besser verstehen was ich meine:

    http://www.pegelonline.wsv.de/webser...ebservice?WSDL

  10. #10
    eRaaaa


    Naja das ist ja eine WSDL, (siehe mein edit) die enthält doch gar nicht die Werte die du haben willst? Wie schon im edit gesagt, wieso lässt du dir nicht einfach den entsprechenden Client(java Dateien) generieren aus der WSDL Datei?

    Siehe: Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 19.7 Daily Soap

    Oder noch einfacher das Ganze der Entwicklungsumgebung wie Eclipse machen lassen

  11. #11
    k_g


    ja weil ich keine ahnung habe wie das geht
    ich hab bisher mit java halt nur sowas gemacht wie ein editor erstellen. Aber die ganzen sachen die im zusammenspiel mit Internet funktionieren habe ich noch nie gemacht.

  12. #12
    eRaaaa


    Dann hilfts evtl. den Link zu lesen, anders kann mir dir jetzt nicht helfen ohne konkrete Frage!

  13. #13
    k_g


    ich weis gar nicht welche konkreten fragen ich stellen kann.
    ich arbeite ja mit eclipse du sagst es geht da so einfach das mir das automatisch erstellt wird?

  14. #14
    eRaaaa


    Ja siehe z.B. hier: Create a Web Service client using Eclipse

    Allerdings weiss ich jetzt nicht mehr ob du evtl. etwas nachinstallieren musst (z.B. WTP o.ä.)

    Ein bisschen Eigeninitiative wäre auch gut, steht eig. alles im Internet, bei konkreten Fragen oder Problemen kannst du ja dann nachfragen.

    Ich war aber mal so frei und habe dir ein Eclipse-Projekt erstellt(und hier angehängt) wo die Java-Dateien schon generiert sind.
    In dem Package [C]org.java.forum.app[/C] ist eine main-Class die du dir mal anschauen kannst als Beispiel, ansonsten verweise ich auf die Doku: PEGELONLINE

    Damit kannst du jetzt ein wenig rumspielen! (Eclipse: File - Import - General > Existing Project... - select archive File)
    Angehängte Dateien Angehängte Dateien

  15. #15
    k_g


    hey danke
    ja irgendwas muss ich bei mir noch nachinstallieren den bei mir lässt es sich nicht ausführen
    aber danke ich werde mir das ganze mal durchlesen

  16. #16
    k_g


    ich habe jetzt mein problem anders gelöst. und zwar habe ich mir aus der wsdl eine xml anfrage zusammengestellt und über einen HTTP Client mit den Internet verbunden,so dass ich es verschicken kann und auch eine antwort zurück bekomme.
    Mein Quelltext:
    Java Code:
    1.  
    2. import java.io.BufferedReader;
    3. import java.io.BufferedWriter;
    4. import java.io.IOException;
    5. import java.io.InputStreamReader;
    6. import java.io.OutputStreamWriter;
    7. import java.net.InetAddress;
    8. import java.net.Socket;
    9. import java.net.URLEncoder;
    10. import java.net.UnknownHostException;
    11.  
    12.  
    13. public class test2 {
    14.  
    15. /**
    16. * @param args
    17. * @throws IOException
    18. * @throws UnknownHostException
    19. */
    20. public static void main(String[] args) throws UnknownHostException, IOException {
    21. System.out.println("XML");
    22. String data = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"> <soap:Body> <getMessungenAktuell xmlns=\"http://pegelonline.wsv.de/webservices/version2_3/2007/10/31\"> <parameterName>WASSERSTAND ROHDATEN</parameterName> <messstellenNummern></messstellenNummern> <messstellenNamen>FRANKFURT OSTHAFEN</messstellenNamen> <start>2011-05-26T00:00:00</start> <ende>2011-05-26T14:00:00</ende> </getMessungenAktuell> </soap:Body></soap:Envelope>";
    23. String hostname = "www.pegelonline.wsv.de";
    24. int port = 80;
    25. InetAddress addr = InetAddress.getByName(hostname);
    26.  
    27. System.out.println(addr.toString());
    28.  
    29. Socket socket = new Socket(addr, port);
    30.  
    31.  
    32. String path = "/webservices/version2_3/2007/10/31/PegelonlineWebservice";
    33. BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));
    34. System.out.println("Writer");
    35. wr.write("POST " + path + " HTTP/1.0\r\n");
    36. wr.write("Content-Length: " + data.length() + "\r\n");
    37. wr.write("Content-Type: text/plain; charset=UTF-8\r\n");
    38. wr.write("SOAPAction: getMessungenAktuell\r\n");
    39. wr.write("\r\n");
    40.  
    41. wr.write(data);
    42. wr.flush();
    43.  
    44. System.out.println("Write");
    45.  
    46. BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    47. String line;
    48. while ((line = rd.readLine()) != null) {
    49. System.out.println(line);
    50. }
    51. System.out.println("While");
    52. wr.close();
    53. rd.close();
    54. socket.close();
    55. }
    56.  
    57.  
    58. }


    Das ganze funktioniert auch, nur jetzt ist das Probelm nur das Datum. Und zwar habe ich hier ein festes Datum in mein Quellcode eingebaut. Jedoch möchte ich natürlich die Daten von einem beliebigen Datum bekommen ohne jedesmal im Quellcode in der Anfrage das Datum verändern zu müssen. Also durch eine eingabe in meiner java anwendung wen diese ausgeführt wird?

  17. #17
    eRaaaa


    Zitat Zitat von k_g Beitrag anzeigen
    Also durch eine eingabe in meiner java anwendung wen diese ausgeführt wird?
    Och Mensch! Da gibts doch wieder tausend verschiedene Ideen, bitte genau erklären wie du dir das vorstellst!

    - beim Start der Anwendung übergeben? (z.B. durch [C]java test2 deinDatum[/C]) Dann wäre das args-Array die richtige Wahl
    - eine kleine GUI mit Textfeld/DatePicker?
    - soll das Programm auf der Konsole nach dem Datum fragen? Dann könntest du dir den Scanner/BufferedReader anschauen!
    -....

    Und wobei gibts bei der jeweiligen Variante Probleme?

  18. #18
    k_g


    ja also z.b. will ich das so machen das wen ich das Programm starte ein kleines fenster kommt wo man das datum eingibt und dann auf ok klickt und es dann erst meine anfrage ausführt...

  19. #19
    eRaaaa


    Java Code:
    1.  
    2. String datum = JOptionPane.showInputDialog(null,"Bitte Datum eingeben","Datumseingabe",JOptionPane.PLAIN_MESSAGE);
    3. //hier evtl. datum validieren ?!

    und dann eben deinen data-String neu zusammensetzen mit dem Datum ?!

  20. #20
    k_g


    eine anzeige wo steht bitte daum eingeben steht und dort die antwort in eine Variable zu speichern kann ich ja auch. das habe ich in c++ auch gemacht mit den cin und cout funktionen. Ich wusste eigentlich nicht wie ich dann meine eingabe grad in den einen bestimmten teil meiner anfrage übergebe. weil mir ist der zusammenhang auch nicht ganz klar. weil START in meiner xml anfrage ist ja ein Element oder halt das child eines Elements aus meiner xml anfrage. Und wenn ich ein Datum eingebe, speichere ich das doch in eine Variable(also so war das zumindestens in c++). Und wie übergebe ich dann einen wert aus einer variable in einen wert in einen Element einer XML..

Ähnliche Themen
  1. Fritz!Box | Kleine Anwendung zum auslesen des WPA/WPA2 Schlüssels und auslesen ...
    Von Anonym11001110 im Forum Codeschnipsel u. Projekte
    Antworten: 5
    Letzter Beitrag: 23.04.2012, 18:30
  2. Serialisierung: speichern und auslesen, auslesen klappt nicht
    Von kuzdu im Forum Java Basics - Anfänger-Themen
    Antworten: 14
    Letzter Beitrag: 01.03.2012, 16:10
  3. Datenpakete auslesen / Ram auslesen
    Von obi im Forum Allgemeine Java-Themen
    Antworten: 6
    Letzter Beitrag: 18.09.2009, 10:09
  4. Spalten Namen auslesen und Zeilen daten auslesen
    Von im Forum Datenbankprogrammierung
    Antworten: 17
    Letzter Beitrag: 21.03.2007, 17:26
  5. Zip-Archiv auslesen und Entry-Informationen auslesen
    Von Luma im Forum Allgemeine Java-Themen
    Antworten: 3
    Letzter Beitrag: 30.03.2005, 13:54