# XMl auslesen



## k_g (30. Mai 2011)

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:

```
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" );
}
}
```


----------



## geneticZ (30. Mai 2011)

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

```
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);
    }
```


----------



## k_g (30. Mai 2011)

ich mein mein code jetzt so geändert 
java code:

```
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)


----------



## eRaaaa (30. Mai 2011)

Naja 
	
	
	
	





```
Anfragen
```
 ist eine Liste, und kein 
	
	
	
	





```
Element
```
 o.ä. da gibts keine Methode 
	
	
	
	





```
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

```
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 )


----------



## k_g (30. Mai 2011)

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


----------



## eRaaaa (30. Mai 2011)

k_g hat gesagt.:


> 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!

```
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 


> ich weis nicht wie man mit xPath arbeitet...


Mhm, das vereinfacht die Sache etwas, denn alles was du bräuchtest wäre

```
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());
```


----------



## k_g (30. Mai 2011)

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.


----------



## eRaaaa (30. Mai 2011)

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? =)


----------



## k_g (30. Mai 2011)

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


----------



## eRaaaa (30. Mai 2011)

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


----------



## k_g (30. Mai 2011)

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.


----------



## eRaaaa (30. Mai 2011)

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


----------



## k_g (30. Mai 2011)

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?


----------



## eRaaaa (30. Mai 2011)

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 
	
	
	
	





```
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)


----------



## k_g (30. Mai 2011)

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


----------



## k_g (7. Jun 2011)

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:

```
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?


----------



## eRaaaa (7. Jun 2011)

k_g hat gesagt.:


> 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 
	
	
	
	





```
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?


----------



## k_g (8. Jun 2011)

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


----------



## eRaaaa (8. Jun 2011)

```
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:


----------



## k_g (9. Jun 2011)

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


----------

