XMl auslesen

Dieses Thema im Forum "XML und Co." wurde erstellt von k_g, 30. Mai 2011.

  1. k_g

    k_g Neues Mitglied

    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:
    Code (Java):

                   
    public class XML {
       
        public static void main (String[]args) throws JDOMException
    {
            String filename = "response.xml";
            Document doc = new SAXBuilder().build( response.xml );
            Element getMessungenAktuellResponse = doc.getRootElement();
            List Antworten = MessungenAktuellResponse.getChildren( "getMessungenAktuellReturn" );
            String getraenk = Antworten.getChildText( "messwert" );
    }
    }
     
  2. geneticZ

    geneticZ Neues Mitglied

    Hi,
    du musst die Liste mit einem Iterator durchlaufen und bei getChild den Namespace mit übergeben!
    Bei genauerer Betrachtung stimmt da einiges nicht...
    Code (Java):

    this.doc = new SAXBuilder().build(xmlFile);
    Element root = doc.getRootElement();
    Namespace ns = root.getNamespace();
    List<?> childList = root.getChildren();
    //Mit einem Iterator diese Liste durchlaufen
    Iterator<?> iter = childList.iterator();
        while (iter.hasNext()) {
            Element group = (Element)iter.next();
            Element groupHeader = group.getChild("GroupHeader", ns);
        }
     
     
    Zuletzt bearbeitet: 30. Mai 2011
  3. k_g

    k_g Neues Mitglied

    ich mein mein code jetzt so geändert
    java code:
    Code (Java):

    import java.io.IOException;
    import java.util.Iterator;
    import java.util.List;

    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.JDOMException;
    import org.jdom.Namespace;
    import org.jdom.input.SAXBuilder;

                   
    public class XML {
       
        public static void main (String[]args) throws JDOMException, IOException
    {
            String filename = "E:\\Dokumente und Einstellungen\\konstantin.grinspon\\Desktop\\response.xml";
            Document doc = new SAXBuilder().build( filename );
            Element Envolpe = doc.getRootElement();
            Namespace ns = Envolpe.getNamespace();

            Element Body = Envolpe.getChild("Body");
            Namespace ns1 = Body.getNamespace();
            List Anfrage = Body.getChildren( "getMessungenAktuellResponse" );
            List  Antworten= Anfrage.getChildren("getMessungenAktuellReturn");
            Iterator<Element> i= Antworten.iterator();
            while(i.hasNext())
                    {
                Element e= i.next();
            String messwert = e.getChildText( "messwert",ns1 );
                    }
    }
    }
     
    es klappt treotzdem nicht besonders bei der List Antworten steht es ist ein fehler bei getChildren vorhanden (das er undifindet ist)
     
  4. eRaaaa

    eRaaaa Moderator

    Naja
    Code (Text):
    Anfragen
    ist eine Liste, und kein
    Code (Text):
    Element
    o.ä. da gibts keine Methode
    Code (Text):
    getChildren
    !

    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
    Code (Java):

            String filename = "E:\\Dokumente und Einstellungen\\konstantin.grinspon\\Desktop\\response.xml";
            Document doc = new SAXBuilder().build(filename);
            Element envolpe = doc.getRootElement();
            Element body = envolpe.getChild("Body", envolpe.getNamespace());
            Namespace ns = Namespace.getNamespace("ns","http://pegelonline.wsv.de/webservices/version2_3/2007/10/31");
            List<Element> anfrage = body.getChildren("getMessungenAktuellResponse",ns);
            for (Element element : anfrage) {
                List<Element> antworten = element.getChildren("getMessungenAktuellReturn", ns);
                for (Element e : antworten) {
                    String messwert = e.getChildText("messwert", ns);
                    System.out.println(messwert.trim());
                }
            }
     
    (oder einfach XPath benutzen :D)
     
  5. k_g

    k_g Neues Mitglied

    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. eRaaaa

    eRaaaa Moderator

    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!
    Ja natürlich!
    Code (Java):

            Iterator<Element> it = anfrage.iterator();
            while (it.hasNext()) {
                List<Element> antworten = it.next().getChildren("getMessungenAktuellReturn", ns);
                Iterator<Element> it2 = antworten.iterator();
                while (it2.hasNext()) {
                    String messwert = it2.next().getChildText("messwert", ns);
                    System.out.println(messwert.trim());
                }
            }
     
    ist aber gefährlicher und mehr Schreibarbeit :)
    Mhm, das vereinfacht die Sache etwas, denn alles was du bräuchtest wäre
    Code (Java):

            String filename = "E:\\Dokumente und Einstellungen\\konstantin.grinspon\\Desktop\\response.xml";
            Document doc = new SAXBuilder().build(filename);
            XPath xpath = XPath.newInstance("//ns:messwert");
            xpath.addNamespace(Namespace.getNamespace("ns", "http://pegelonline.wsv.de/webservices/version2_3/2007/10/31"));
            Element messwert = (Element) xpath.selectSingleNode(doc.getRootElement());
            System.out.println(messwert.getValue().trim());
     
     
  7. k_g

    k_g Neues Mitglied

    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. eRaaaa

    eRaaaa Moderator

    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? =)
     
    Zuletzt bearbeitet: 30. Mai 2011
  9. k_g

    k_g Neues Mitglied

    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/webservices/version2_3/2007/10/31/PegelonlineWebservice?WSDL
     
  10. eRaaaa

    eRaaaa Moderator

    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 :D
     
  11. k_g

    k_g Neues Mitglied

    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. eRaaaa

    eRaaaa Moderator

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

    k_g Neues Mitglied

    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. eRaaaa

    eRaaaa Moderator

    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
    Code (Text):
    org.java.forum.app
    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)
     

    Anhänge:

  15. k_g

    k_g Neues Mitglied

    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. k_g

    k_g Neues Mitglied

    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:
    Code (Java):

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.URLEncoder;
    import java.net.UnknownHostException;


    public class test2 {

        /**
         * @param args
         * @throws IOException
         * @throws UnknownHostException
         */

        public static void main(String[] args) throws UnknownHostException, IOException {
            System.out.println("XML");
                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>";
                String hostname = "www.pegelonline.wsv.de";
                int port = 80;
                InetAddress addr = InetAddress.getByName(hostname);

                System.out.println(addr.toString());
               
                Socket socket = new Socket(addr, port);


                String path = "/webservices/version2_3/2007/10/31/PegelonlineWebservice";
                BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));
                System.out.println("Writer");
                wr.write("POST " + path + " HTTP/1.0\r\n");
                wr.write("Content-Length: " + data.length() + "\r\n");
                wr.write("Content-Type: text/plain; charset=UTF-8\r\n");
                wr.write("SOAPAction: getMessungenAktuell\r\n");
                wr.write("\r\n");

                wr.write(data);
                wr.flush();
               
                System.out.println("Write");
               
                BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String line;
                while ((line = rd.readLine()) != null) {
                  System.out.println(line);
                }
                System.out.println("While");
                wr.close();
                rd.close();
                socket.close();
              }


    }
     
    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. eRaaaa

    eRaaaa Moderator

    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
    Code (Text):
    java test2 deinDatum
    ) 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. k_g

    k_g Neues Mitglied

    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. eRaaaa

    eRaaaa Moderator

    Code (Java):

    String datum = JOptionPane.showInputDialog(null,"Bitte Datum eingeben","Datumseingabe",JOptionPane.PLAIN_MESSAGE);
    //hier evtl. datum validieren ?!
     
    und dann eben deinen data-String neu zusammensetzen mit dem Datum ?! :bahnhof:
     
  20. k_g

    k_g Neues Mitglied

    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..
     
Die Seite wird geladen...