# Aus XML mit JDOM aus Elementattributen Werte rauslesen



## flanel (10. Jul 2012)

Servus!
Ich bin relativ neu in der java Programmierung und brauch für meine Arbeit auch nur einen klitzekeines Skript, leider bekomm ich es weder mit google, noch mit SuFu noch mit "Java ist auch eine Insel" in den Griff. Ich habe folgendes Problem: Aus meiner XML Datei will ich nur das Element "pod" mit dem title="Result" und dem Child subpod...kurzum, ich brauch den String "23". Mehr nicht.
Mein Problem ist, dass, egal was ich lese, immer nur von Elementen beschrieben wird, wie man an sie ran kommt. Ich habe jetzt mal versucht, eine Liste von allen Children pod zu machen und mir diese auszugeben. Das klappt auch (1). Nun will ich als Ausgabe aber nur den Inhalt vom pod mit dem title "Result"; hierfür hab ich versucht, alle Werte der <plaintext> Elemente zu bekommen. Das klappt nicht (2).Anzeige in der Konsole: java.lang.NullPointerException. Außenrum habe ich einen Iterator gebastelt (wie zu sehen) und das ganze läuft in einer while- Schleife. Mein dritter Ansatz war, da ich festgestellt habe, dass in der xml-Datei das Element pod was ich will, das einzige ist, was im <subpod> einen boolean "primary" ist, mit dem man vielleicht eine if Abfrage machen kann.Ist der Wert true,dann schreibe die ausgabe in die Konsole(3) Dies gibt mir aber in der Konsole auch wieder nur die java.lang.NullPointerException. Ob und wo jetzt vielleicht noch ein ".getValue()" oder so was in der Art fehlt, ist erstmal nicht wichtig (darüber soll auch großzügig hinweggesehen werden), auch dass das ganze ohne try /catch exception usw. hier dargestellt wird, es geht nur um die Fragestellung, wie ich denn nun an die 23 dran komme!
Vielen Dank schonmal in Voraus! 
PS: Das package ist von der CD von der Insel, ich selbst benutzte Eclipse und die Imports funktionieren!
[xml]
<queryresult success='true' error='false' numpods='5' datatypes='Math' timedout='' timedoutpods='' timing='0.337' parsetiming='0.105' parsetimedout='false' recalculate=''
    id='MSPa45731a25d63ea6g1i0a800006a9gfd3d069d1561' version='2.5'>
 <pod title='Input'
     scanner='Identity'
     id='Input'
     position='100'
     error='false'
     numsubpods='1'>
  <subpod title=''>
   <plaintext>3+4 5</plaintext>
  </subpod>
 </pod>
 <pod title='Result'
     scanner='Identity'
     id='Result'
     position='200'
     error='false'
     numsubpods='1'
     primary='true'>
  <subpod title=''
      primary='true'>
    string(<plaintext>23</plaintext>)

  </subpod>
 </pod>
 <pod title='Number name'
     scanner='Integer'
     id='NumberName'
     position='300'
     error='false'
     numsubpods='1'>
  <subpod title=''>
   <plaintext>twenty-three</plaintext>
  </subpod>
 </pod>
 <pod title='Visual representation'
     scanner='Integer'
     id='VisualRepresentation'
     position='400'
     error='false'
     numsubpods='1'>
  <subpod title=''>
   <plaintext>* * * * * * * * * * * * * * * * * * * * * * *</plaintext>
  </subpod>
 </pod>
 <pod title='Number line'
     scanner='NumberLine'
     id='NumberLine'
     position='500'
     error='false'
     numsubpods='1'>
  <subpod title=''>
   <plaintext></plaintext>
  </subpod>
 </pod>
</queryresult>
[/xml]


```
package com.tutego.insel.xml.jdom;

import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;

class Versuch5
{
  public static void main( String[] args ) throws Exception
  {
    Document doc = new SAXBuilder().build( "query.xml" );
    
    Element qlesen = doc.getRootElement();

    Iterator<?> blaListe = qlesen.getChildren( "pod" ).iterator();
    
   
    

    while ( blaListe.hasNext() )
    {
      Element pod = (Element) blaListe.next();
//     String title =  pod.getAttribute("id").getValue();
    boolean  titlematch = qlesen.getChild("pod").getChild("subpod").getAttribute("primary").getBooleanValue();
          
     System.out.println(pod.getAttribute("title").getValue());                                                         //  <-- geht    1
//   System.out.println(pod.getChild("Subpod").getChild("Plaintext").getValue());									   //  <-- geht nicht 2
     
     
     

//     if (titlematch)
//   {
//   	 System.out.println(title);
//    }
   
      
    }
    

  }
}
```


----------



## nillehammer (11. Jul 2012)

```
//   System.out.println(pod.getChild("Subpod").getChild("Plaintext").getValue());
```
Groß-/Kleinschreibung beachten. Deine Elemente heißen _subpod_ und _plaintext_ mit *kleinem* Anfangsbuchstaben.


----------



## Kritiki (11. Jul 2012)

du könntest deine Attribute mit indexof("result") > 0 abfragen, so könntest du die Ergebnisse nur mit dem
String "result" herausfiltern.


----------



## flanel (11. Jul 2012)

```
System.out.println(pod.getChild("subpod").getChild("plaintext").getValue());
```
geht!
allerdings hab ich dann alle, ich will aber nur den einen!

 [c]Exception in thread "main" java.lang.NullPointerException [/c]

und das 
	
	
	
	





```
indexof("result") > 0
```
 weiß ich nicht einzufügen, sorry! kannst du mir sagen, wie ich das schreiben soll? Ich wär dir echt dankbar!


----------



## flanel (11. Jul 2012)

Alles klar! Es klappt jetzt!


```
class Versuch5
{
  public static void main( String[] args ) throws Exception
  {
    Document doc = new SAXBuilder().build( "query.xml" );
    
    Element qlesen = doc.getRootElement();

    Iterator<?> blaListe = qlesen.getChildren( "pod" ).iterator();
     
    

    while ( blaListe.hasNext() )
    {
      Element pod = (Element) blaListe.next();																		  
    String title =  pod.getAttribute("id").getValue();															   
   
    if ("Result".equals(title))
    		{
    	 String ergebnis = pod.getChild("subpod").getChild("plaintext").getValue();
    	  System.out.println(ergebnis);		
               										
    		}    
    }
  }
}
```
Vieln Dank euch beiden!


----------

