# XML-Document auslesen



## wane (9. Mai 2004)

*stevg: sorry, hab ausversehen zu viel gelöscht, habs noch mal unter deinem Namen gepostet*

Hallo zusammen,
ich möchte eine XML Datei aus einem Applet heraus lesen und parsen.
Die Datei liegt natürlich auf dem Server im selben Verzeichnis wie das Applet.

Ich habe nach ewigem Suchen jetzt 2 bzw. 3 Möglichkeiten entdeckt. Welche ist wohl die geeignetste und wie funktioniert sie?!

1) XML-Datei mit BufferedReader in einen String einlesen und danach mit einem Parser durchparsen --> klingt ganz gut, nur versteh ich nicht, wie ich den Parser aufbauen soll

Code:

```
public void readFile() throws Exception{
     
   
    URL yahoo = new URL("http://localhost/classes/Test.xml");
        BufferedReader in = new BufferedReader(
                                new InputStreamReader(
                                yahoo.openStream()));

        String inputLine;
        String sGesamttext="";

        while ((inputLine = in.readLine()) != null){
            System.out.println(inputLine);
            sGesamttext = sGesamttext + "\n" + inputLine;}

        in.close();
        System.out.println(sGesamttext);
    }
```
2) XML-Datei mit dem SAXParser durchparsen -->

Code:
DefaultHandler handler = new DefaultHandler();
      File datei = new File(sDateiName);
      SAXParserFactory factory = SAXParserFactory.newInstance();
      SAXParser saxParser = factory.newSAXParser();
      saxParser.parse(datei, handler);


Der handler wird mir jetzt wahrscheinlich die einzelnen Tags herauslesen ... wenn ich herausbekomm, wie das funktioniert ...
Die einzelnen Tags will ich dann vorerst nur mal über System.out.println("...") ausgeben.

3) XML-Datei über einen DocumentBuilder als ein Document Objekt parsen -->

Code:

```
DocumentBuilderFactory factory  = DocumentBuilderFactory.newInstance();
    DocumentBuilder        builder  = factory.newDocumentBuilder();
    Document               document = builder.parse( new File(INFO.XML) );
    NodeList ndList = document.getElementsByTagName("Title"); 
      for( int i=0; i<ndList.getLength(); i++ ){
        System.out.println(ndList.getFirstChild());
      }
```

Okay, hier bekomme ich wohl eine Liste heraus, mit der ich wohl fortfahren muss.

Ich denke, dass 2) der geschickteste Weg ist. Nur leider kapier ich es nicht ganz, wie ich dem SAXParser sage, was er für mich parsen soll.

mit dem Aufruf parse(datei,handler) sage ich dem Parser über den Handler, wie er mit dem geparsten Text verfahren soll, oder?

Gibts da einfache Besipiele?


Bin ich da überhaupt auf dem richtigen Weg?
Ich möchte in meinem Applet eigentlich nur ein paar Knoten und Attribute aus meiner XML-Datei heraus lesen. ganz einfach. Ich finde aber nur Beispiele mit Applikationen und Handler Klassen ... lauter böhmische Dörfer...


Danke für eure Hilfe ...


----------



## stev.glasow (9. Mai 2004)

Hier gibt es eine kurzes Tutorials zu SAX:  http://www.xmlguru.de/html/_d/04buch/buch20_d_kap02-1.htm

Ich persönlich (das muss aber nichts heißen) nutzen immer gern JDOM. Das ist auch recht einfach zu handhaben:
hier eine kleiners Beispiel:
// das Dokument (ist nur ein Beispiel)

```
<java-forum>
   <user name="stevg" password="kashdljhlshdfl">
		<postid value="2"/>
		<postid value="4"/>
   </user>
   
   <user name="roro" password="1324jl25234h">
		<postid value="1"/>
		<postid value="3"/>
   </user>
   
   <post id="1" title="Problem mit Dingsbums">
   	Hallo und so
   </post>
   
   <post id="2" title="">
   	BlaBliBlo
   </post>
   
   <post id="3" title="">
   	Danke
   </post>
   
   <post id="3" title="">
   	Bitte
   </post>
   
</java-forum>
```


// eine Methode um alle Posts eines bestimmten Users auszugegeben

```
public void printPostFromUser(String username){
    SAXBuilder saxBuilder = new SAXBuilder();
    Document doc  = saxBuilder.build(new URL("http://www.java-forum.org/example.xml"));
    Element root = doc.getRootElement();
    
    Vector pids = new Vector(); // enthält später die zum user dazu gehörenden Postids
    
    // user im Dukument suchen
    List users = root.getChildren("user");
    Iterator i = users.iterator();
    while(i.hasNext()){ 
    	Element user = (Element)i.next();
    	String name = user.getAttributeValue("name");
    	if(name != null && name.equals("username")){ // user gefunden
    		
    		// postids des users ermittln
    		List postids = user.getChildren("postid");
    		i = postids.iterator();		
    		while(i.hasNext()){
    			Element postid = (Element)i.next();
    			String value = user.getAttributeValue("value");
    			if(value != null){
    				pids.add(value);
    			}
    		}
    		break;
    	}    	
    }
    
    // Posts nach entsprechender id durchsuchen und Title und Inhalt ausgeben
    List posts = root.getChildren("post");
    i = users.iterator();
    while(i.hasNext()){ 
    	Element post = (Element)i.next();
    	String id = post.getAttributeValue("id");
    	if(id != null && pids.contains(id)){
    		String title = post.getAttributeValue("title");
    		id(title != null){
    			System.out.println("Titel: " + title + "\n");
    		}
    		System.out.println("Text:" + post.getText() + "\n"); // mit der getText() bin ich mir nicht ganz sicher
    	}
    }
}
// hab das jetzt nicht getesten, sollte auch nur de Ansatz erklären
```

Die Ausgabe für printPostFromUser("roro") würde dann in etwa so aussehen:
Title: Problem mit Dingsbums
Text: Hallo und so
Text: Danke


----------



## wane007 (9. Mai 2004)

Hallo, vielen Dank. Sowas hab ich gesucht. den Rest bekomm ich dann hoffentlich hin..


----------

