# xml einlesen und bestimmte Elemente an eine gui_Klasse überg



## gast (19. Okt 2006)

Brauche dringend Hilfe!!! :bahnhof: 
muss eine XML datei einlesen und bestimmte Elemente in eine Tabelle der GUI_Klasse übergeben
die Xml sieht folgendermaßen aus:

```
<?xml version="1.0" encoding="ISO-8859-1" ?> 
- <papoFuerKapo xmlns="http://www-pss/Aep2Pss/Papo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://www-pss/Aep2Pss/Papo http://c024140/xml/schema/Aep2Pss/REL-4.0/Papo.xsd" 
vorgang="neuzugang" aeppEreignis="neuzugang" vorgangsdatum="2001-05-31T13:20:00" messageID="2316402" 
aeppFreigabeID="2316402" version="REL-4.0">
    - <common>
        +<kopf>
        - <inhalt>
              - <arbeitsplan nr="0">
                      - <arbeitsgang nr="1" einsatzNr="1" flsDomaene="DU.WB.WBW2">
                             <entfaellt_weil_vorrat>true</entfaellt_weil_vorrat> 
                             <aggregat>000138</aggregat> 
                             - <arbeitsvorgaenge>
                                  <arbeitsvorgang name="STAHLERZ" /> 
                                  </arbeitsvorgaenge>
                             - <eigenschaften>
                                  <numEigenschaft einheit="kg" wert="0" name="AUFTRGEW_PROZ_MIN" /> 
                                  <textEigenschaft name="BESAEUMEN_BEIZE_SONDERFALL" wert="" /> 
                                  </eigenschaften>
                                  </arbeitsgang>
                      + <arbeitsgang nr="2" einsatzNr="2" flsDomaene="DU.WB.WBW2">
                      + <arbeitsgang nr="3" einsatzNr="3" flsDomaene="DU.WB.WBW2">
                      - <transportArbeitsgang nr="11" einsatzNr="10">
                              <entfaellt_weil_vorrat>false</entfaellt_weil_vorrat> 
                              <startTermin>2005-03-27</startTermin> 
                              <aggregat>000479</aggregat> 
                            - <arbeitsvorgaenge>
                                      <arbeitsvorgang name="TRANSPORT" /> 
                                      </arbeitsvorgaenge>
                                      </transportArbeitsgang>
                      + <arbeitsgang nr="4" einsatzNr="4" flsDomaene="DU.WB.WBW2">
```
Muss hierbei nur die flsDomäne, entfaellt_weil_vorrat,aggregat,arbeitsvorgang name,startTermin von Arbeitsgängen und transport arbeitsgängen auslesen!!
Hab es mit Jdom versucht komme aber nicht weiter!!Irgend wie stört beim durchgehen der Wurzelelemente der Namespace.
kann bir bitte jemand helfet!!!!!!


----------



## spoensche (19. Okt 2006)

Wenn es mit jdom nicht geht, versuch es einfach mal mit dem SAX Parser.


----------



## Guest (20. Okt 2006)

Ja, ist auch eine Lösung, aber mich würde mal interessieren warum das mit JDOM nicht geht!!!
So lange ich Namespace drin habe funktioniert es nicht!!Nicht mal die einfache ausgabe

 Element root = doc.getRootElement();   
 System.out.println(root);


```
<?xml version="1.0" encoding="ISO-8859-1" ?> 
- <papoFuerKapo xmlns="http://www-pss/Aep2Pss/Papo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www-pss/Aep2Pss/Papo http://c024140/xml/schema/Aep2Pss/REL-4.0/Papo.xsd" 
vorgang="neuzugang" aeppEreignis="neuzugang" vorgangsdatum="2001-05-31T13:20:00" messageID="2316402" 
aeppFreigabeID="2316402" version="REL-4.0">
```

wenn ich die ganze Kacke (Namespace) wegmache dann läuft der Scheiß komischerweise!!
also:

```
<?xml version="1.0" encoding="ISO-8859-1" ?> 
- <papoFuerKapo  
vorgang="neuzugang" aeppEreignis="neuzugang" vorgangsdatum="2001-05-31T13:20:00" messageID="2316402" 
aeppFreigabeID="2316402" version="REL-4.0">
```

Woran könnte es liegen??


----------



## foobar (20. Okt 2006)

Poste doch mal etwas Code. Wie sieht die Konfiguration des Parsers aus? Hast du NamespaceAware gesetzt?


----------



## Guest (20. Okt 2006)

ok, hier ist es:

```
public class parser 

{  
	
        public static void main(String[] args) 
        { 

            //pfad xmleinlesen = new pfad();
            //String AktuellerPfad = xmleinlesen.AbsPfad;
            //System.out.println( AktuellerPfad );
            
        	//Bauen eines XML-Lesers auf Basis von SAX auf
                     SAXBuilder sxbuild = new SAXBuilder(); 
                     //Erzeugen eines Objekts anhand der ausgewählten Datei im Input_Projekt
                     InputSource is = new InputSource("D:/vitalik/ConvAV2/1.xml"); 
                     try 
                     {       
                    	 //Erzeugen eines JDOM-Dokuments anhand der Datei 
                         Document doc = sxbuild.build(is);                         
                         //Lesen des Wurzelelements des JDOM-Dokuments doc                        
                         Element root = doc.getRootElement();   
                         //Wandern durch die Wurzelelemente
                         Element common = root.getChild("common"); 
                         Element inhalt = common.getChild("inhalt"); 
                         Element aplan = inhalt.getChild("arbeitsplan");
                         
                         //Liste der Arbeitsgänge erzeugen
                         List argang = aplan.getChildren("arbeitsgang");                
                         Iterator iterator = argang.iterator(); 
                         while(iterator.hasNext()) 
                         {                
                        	 Element tempElement = (Element)iterator.next();
                        	 String flsdom =tempElement.getAttributeValue("flsDomaene");
                        	 String nr =tempElement.getAttributeValue("nr");
                        	 String date =tempElement.getChildText("startTermin");
                             String entf = tempElement.getChildText("entfaellt_weil_vorrat"); 
                             String agr = tempElement.getChildText("aggregat");  
                             String avname =tempElement.getChild("arbeitsvorgaenge").getChild("arbeitsvorgang").getAttributeValue("name");
                        	 
                             System.out.println(nr);
                             System.out.println(avname);
                        	 System.out.println(agr);
                        	 System.out.println(flsdom);      
                        	 System.out.println(date);
                        	 System.out.println(entf);
                        	 System.out.println("");
                         } 
                         


                     } 
                     catch(Exception e){} 
         
        } 
}
```


----------



## clemson (20. Okt 2006)

verwende doch mal die Element#getChildren(String, Namespace) methode...

mit dem namespace Namespace#getNamespace(String,String)


dann sollte die "kacke" - wie du so schön sagst - auch mit namespace funktionieren...


----------



## niemand (21. Okt 2006)

> Ja, ist auch eine Lösung, aber mich würde mal interessieren warum das mit JDOM nicht geht!!!


Mein erster Gedanke, als ich dein Beispieldokument gesehen habe: "Well-formed ist das aber nicht". 

Ich habe wenig Erfahrung mit XML, aber vielleicht liege ich nicht so verkehrt.

cu


----------



## Guest (23. Okt 2006)

clemson hat gesagt.:
			
		

> verwende doch mal die Element#getChildren(String, Namespace) methode...
> 
> mit dem namespace Namespace#getNamespace(String,String)
> 
> ...



Joop danke es funzt :toll: 

und nun eine andere Frage:
nter dem Punkt "arbeitsplan" sind ja bei mir Wurzelelemente "arbeitsgang", "transport","schnittstellen" usw aufgeführt
nun möchte ich nur die Arbeitsgänge und die Transporte in eine Liste aufnehmen und in der gleichen Reihenfolege wie in der xml bestimmte Elemente ausgeben.D.h  in der Xml habe ich z.b 

-arbeitsplan
        +arbeitsgang nr="1" 
        +arbeitsgang nr="2"
        +arbeitsgang nr="3"
        +transportArbeitsgang nr="4" 
        +arbeitsgang nr="5"
        +arbeitsgang nr="6"




Wie geht das??

Ich krieg hin es in 2 listen auszugeben, eine "arbeitsgang" und eine "transportArbeitsgang"-Liste, aber in einer klappt es noch nicht!!

Hier ist Quellcode für die Arbeitsgang Liste für die Tarnsporte sieht sie genauso auf, deswegen habe ich die rausgelassen!

```
//Wandern durch die Wurzelelemente                   
                         Element common = root.getChild("common",ns); 
                         Element inhalt = common.getChild("inhalt",ns); 
                         Element aplan = inhalt.getChild("arbeitsplan",ns);
                                       
                         //Liste der Arbeitsgänge erzeugen
                         List argang = aplan.getChildren("arbeitsgang",ns);                
                         Iterator iterator = argang.iterator(); 
                         while(iterator.hasNext()) 
                         {                
                        	 Element tempElement = (Element)iterator.next();
                        	 String flsdom =tempElement.getAttributeValue("flsDomaene");
                        	 String nr =tempElement.getAttributeValue("nr");
                        	 String date =tempElement.getChildText("startTermin",ns);
                             String entf = tempElement.getChildText("entfaellt_weil_vorrat",ns); 
                             String agr = tempElement.getChildText("aggregat",ns);  
                             String avname =tempElement.getChild("arbeitsvorgaenge",ns).getChild       
                             ("arbeitsvorgang",ns).getAttributeValue("name");
                        	 
                             System.out.println(nr);
                             System.out.println(avname);
                        	 System.out.println(agr);
                        	 System.out.println(flsdom);      
                        	 System.out.println(date);
                        	 System.out.println(entf);
                        	 System.out.println("");
                         } 
danke für eure Hilfe :wink:
```


----------



## clemson (23. Okt 2006)

du möchtest also alle arbeitsgang und alle transportArbeitsgang element in einer liste haben??


```
List arbeitsgangElements = aplan.getChildren("arbeitsgang", ns);
List transportArbeitsgangElements = aplan.getChildren("transportArbeitsgang", ns);
```

??


----------



## Guest (23. Okt 2006)

clemson hat gesagt.:
			
		

> du möchtest also alle arbeitsgang und alle transportArbeitsgang element in einer liste haben??
> 
> 
> ```
> ...


Ja, richtig!!
Exakt in der gleichen Reihenfolge wie diese in der XML Datei aufgelistet sind!!!
Mit deiner lösung aber lese ich zunächts die Arbeitsgänge und danach die Transporte raus, so dass hiernach keine Reihenfolge mehr vorhanden ist, da diese in der xml durcheinender gemischt sind!!!


----------



## clemson (23. Okt 2006)

Okay, dann kommt jetzt xPath ins Spiel. Ein Tutorial zum Thema findest du hier.

Deine gesuchte xPath Abfrage lautet "//*[name() = 'arbeitsgang' or name() = 'transportArbeitsgang']".


```
List arbeitsgangElements = org.jdom.xpath.XPath.selectNodes(aplan, "//*[name() = 'arbeitsgang' or name() = 'transportArbeitsgang']");
```


----------



## Guest (23. Okt 2006)

clemson hat gesagt.:
			
		

> Okay, dann kommt jetzt xPath ins Spiel. Ein Tutorial zum Thema findest du hier.
> 
> Deine gesuchte xPath Abfrage lautet "//*[name() = 'arbeitsgang' or name() = 'transportArbeitsgang']".
> 
> ...



Dat läuft aber net!!  
Krieg eine Fehlermeldung "Fatal exception occured"!
Fehler liegt in der Zeile mit der XPath Zeile



```
java.lang.NoClassDefFoundError: org/jaxen/BaseXPath
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:141)
	at org.jdom.xpath.XPath.newInstance(XPath.java:126)
	at visual.parser.main(parser.java:52)
Exception in thread "main"
```


----------



## clemson (23. Okt 2006)

Achso, die XPath Funktionalität in JDOM ist mittels Jaxen realisiert. Einfach Jar downloaden und in den Classpath aufnehmen. Dann sollte es funktionieren...


----------



## Guest (24. Okt 2006)

clemson hat gesagt.:
			
		

> Achso, die XPath Funktionalität in JDOM ist mittels Jaxen realisiert. Einfach Jar downloaden und in den Classpath aufnehmen. Dann sollte es funktionieren...


so jetzt läft es :lol: 
danke, hast mir sehr geholfen!!!


----------



## Guest (24. Okt 2006)

Na da wahr ich wohl zu voreilig  
kleiner Fehler muss wohl noch drin sein weil ich das sechste Element 2 mal angezeigt bekomme:
enmal an der 6 Stelle, wo es auch stehen soll und das zweite mall am Ende der Liste!

hier noch Mal Quellcode

```
List ArbeitsgnTransport = org.jdom.xpath.XPath.selectNodes(aplan,
                        		 "//*[name() = 'arbeitsgang' or name() = 'transportArbeitsgang']");

                         Iterator iteratorArbeitsgnTransport =ArbeitsgnTransport.iterator();
                    
                       while(iteratorArbeitsgnTransport.hasNext()) 
                         {                
                        	 Element tempElement = (Element)iteratorArbeitsgnTransport.next();
                        	 String flsdom =tempElement.getAttributeValue("flsDomaene");
                        	 String nr =tempElement.getAttributeValue("nr");
                        	 String date =tempElement.getChildText("startTermin",ns);
                             String entf = tempElement.getChildText("entfaellt_weil_vorrat",ns); 
                             String agr = tempElement.getChildText("aggregat",ns);  
                           
                             System.out.println(tempElement);
                             System.out.println(nr);                          
                             //Liste der Arbeitsvorgänge, da mehrere Arbeitsgänge
                             Element agänge =tempElement.getChild("arbeitsvorgaenge",ns);
                             List agängeliste =agänge.getChildren("arbeitsvorgang",ns);  
                             Iterator agängeiter=agängeliste.iterator();
                             	while(agängeiter.hasNext())
                             	{
                             		Element tempElement1 = (Element)agängeiter.next();
                             	String avname =tempElement1.getAttributeValue("name");
                             	System.out.println(avname );
                             	}
                        	 System.out.println(agr);
                        	 System.out.println(flsdom);      
                        	 System.out.println(date);
                        	 System.out.println(entf);
                        	 System.out.println("");
                         }
```


----------



## Guest (26. Okt 2006)

Mal eine andere Frage  
Trage jetzt die Sachen aus der XML in eine Liste rein:

```
try 
                     {       
                    	 //Erzeugen eines JDOM-Dokuments anhand der Datei 
                         Document doc = sxbuild.build(is);                         
                         Element root = doc.getRootElement(); 
                         Namespace ns = root.getNamespace();               
                         Element common = root.getChild("common",ns); 
                         Element inhalt = common.getChild("inhalt",ns); 
                         Element aplan = inhalt.getChild("arbeitsplan",ns);        

                             List ArbeitsgnTransport = org.jdom.xpath.XPath.selectNodes(aplan,
                            		 "//*[name() = 'arbeitsgang' or name() = 'transportArbeitsgang']");
                           Iterator iteratorArbeitsgnTransport =ArbeitsgnTransport.iterator();   
                           
                           List aplist = new ArrayList();
                           List help=new ArrayList();
                           List help3=new ArrayList();

                           while(iteratorArbeitsgnTransport.hasNext()) 
                             {                
                            	 Element tempElement = (Element)iteratorArbeitsgnTransport.next();
                            	 //Benötigten elemente in ein string einlesen
                            	 String flsdom =tempElement.getAttributeValue("flsDomaene");
                            	 String date =tempElement.getChildText("startTermin",ns);
                                 String entf = tempElement.getChildText("entfaellt_weil_vorrat",ns); 
                                 String agr = tempElement.getChildText("aggregat",ns);  
                               
                                 
                                 //Liste der Arbeitsvorgänge, da mehrere Arbeitsgänge
                                 Element agänge =tempElement.getChild("arbeitsvorgaenge",ns);
                                 List agängeliste =agänge.getChildren("arbeitsvorgang",ns);  
                                 Iterator agängeiter=agängeliste.iterator();
                                 	while(agängeiter.hasNext())
                                 	{
                                 	Element tempElement1 = (Element)agängeiter.next();
                                 	//Benötigten elemente in ein string einlesen
                                 	String avname =tempElement1.getAttributeValue("name");
                                 	help.add(avname );
                                 	}
                                 aplist.add(help);
                                 help=new ArrayList();
                            	 aplist.add(agr);
                            	 aplist.add(flsdom);      
                            	 aplist.add(date);
                            	 aplist.add(entf);
                            	 
                            	 }

                           System.out.println(aplist);

                     } 

                     catch(Exception e){} 
         
        }
```
Warum kriege ich die Liste mit System.out.println(aplist); nicht in der Konsole angezeigt??
zeigt bei mir garnichts an, nicht mal eine leere Liste ???:L 
Diese wird aber korrekt gefühlt, weil wenn ich diese vor der geschweiften Klammer anzeigen lasse, sehe ich schritt für schritt wie datensätze zu der Liste hinzukommen.


----------



## Guest (26. Okt 2006)

Sa hab jetzt rausgefunden das die Liste :

```
List ArbeitsgnTransport = org.jdom.xpath.XPath.selectNodes(aplan,
                            		 "//*[name() = 'arbeitsgang' or name() = 'transportArbeitsgang']");
```
20 Elemente stann den 14 die in der Xml sind erzeugt :noe: 
Kann sein, dass etwas mit der XPath Abfrage Nicht stimmt ???


----------



## Guest (26. Okt 2006)

Bin ein schritt weiter :? 
Weiß nun woher die Elemente kommen!
Die aplan Children haben die Wurzeln Arbeitsgang, Transportarbeitsgang und Schnittstellen.
Die Schnittstellen haben widerum wurzelelemente Arbeitsgang.
deswegen kriege ich zu viele Elemente angezeigt, weil auch diese angezeigt werden.
Wie kann man die XPath abfrage ändern, dass er nur die ChildrenElemente des Arbeitsplans durchsuch und nicht weiter in die anderen Wurzeln wandert!!!


----------



## clemson (26. Okt 2006)

vielleicht eine abfrage in richtung:


```
/arbeitsplan/*[name() = 'arbeitsgang' or name() = 'transportArbeitsgang']
```


----------



## Guest (26. Okt 2006)

clemson hat gesagt.:
			
		

> vielleicht eine abfrage in richtung:
> 
> 
> ```
> ...



nicht ganz :noe: 
hatte es auch schon ausprobiert :bahnhof: 
Kann es denn sein, dass Namespace das behindert??


----------



## clemson (26. Okt 2006)

jup, die namespaces machen "probleme":


```
//*[name()='arbeitsplan' and namespace-uri()='http://www-pss/Aep2Pss/Papo']/descendant::*[namespace-uri()='http://www-pss/Aep2Pss/Papo' and (name()='arbeitsgang' or name()='transportArbeitsgang')]
```

oder


```
//*[local-name()='arbeitsplan']/descendant::*[local-name()='arbeitsgang' or local-name()='transportArbeitsgang']
```

oder


```
//*[local-name()='arbeitsplan']//*[local-name()='arbeitsgang' or local-name()='transportArbeitsgang']
```

oder so irgendwie


----------



## Guest (26. Okt 2006)

auch nicht :!: 
Bekomme trotzdem alle Daten angezeigt!!


----------



## clemson (26. Okt 2006)

hmm, dann poste mal so ein xml, welches du verwendest...


oder probier mal

```
//*[local-name()='arbeitsplan']/*[local-name()='arbeitsgang' or local-name()='transportArbeitsgang']
```


----------



## Guest (26. Okt 2006)

es kalppt :applaus: 
danke :!:


----------



## Guest (27. Okt 2006)

ich bins mal wieder,mit eien kleine Kleinigkeit  

```
List Schnitt = org.jdom.xpath.XPath.selectNodes(aplan,
            		 "//*[local-name()='arbeitsplan']/*[local-name()= 'schnittstellenobjekt']");
                     Iterator iteratorSchnitt =Schnitt.iterator();     
                     while(iteratorSchnitt.hasNext()) 
                       { 
                    	 Element tempElement =(Element)iteratorSchnitt.next();
                    	 List schnitt2 =org.jdom.xpath.XPath.selectNodes(tempElement,
                    			 "//*[name() = 'wiederholgruppen' ]");
                    	 System.out.println(schnitt2);
                       }
```
So erzeuge hier eine Liste mit allen Schnittstellen, danach gehe ich durch die Liste solange diese Werte hat und versuche in dieser Liste eine andere zu erzeugen die mir jetzt von dem aktuellen Schnittstellenobjekt die wiederholgruppen liefern soll.
bekomme aber jedes mal wieder die Widerholgruppen aller Schnittstellen und nicht von dem aktuellen Objekt(temp Element). ???:L


----------



## Guest (30. Okt 2006)

Weiß es keiner??? ???:L 
ok versuch dann es anders zu erklären! :### 
Muss aus meiner xml  ich die Texteigenschaften und Numeigenschaften der Transport- und Arbeitsgnge auslesen.
meine XML sieht in etwa so aus:

```
- <arbeitsgang nr="1" einsatzNr="1" flsDomaene="DU.WB.WBW2">
    - <eigenschaften>
          <numEigenschaft einheit="kg" wert="0" name="AUFTRGEW_PROZ_MIN" /> 
          <textEigenschaft name="BESAEUMEN_BEIZE_SONDERFALL" wert="" /> 
      </eigenschaften>
  </arbeitsgang>
- <arbeitsgang nr="2" einsatzNr="2" flsDomaene="DU.WB.WBW2">
    - <eigenschaften>
          <numEigenschaft einheit="null" wert="1" name="ANZAHL_TEILE_AUSLAUF" /> 
          <numEigenschaft einheit="kg" wert="21350" name="COILPAKETMAXGRENZE" /> 
          <numEigenschaft einheit="null" wert="1" name="PRODUKTANZAHLSPALTSTREIFEN" /> 
    </eigenschaften>
 </arbeitsgang>
.
.
- <arbeitsgang nr="6" einsatzNr="6" flsDomaene="DO.KF">
    - <eigenschaften>
          <numEigenschaft einheit="null" wert="1" name="ANZAHL_TEILE_AUSLAUF" /> 
          <numEigenschaft einheit="mm" wert="13" name="BESAEUMZUSCHLAG_MIN" /> 
          <numEigenschaft einheit="kg" wert="21150" name="COILPAKETMAXGRENZE" /> 
  </eigenschaften>
</arbeitsgang>
usw.
```
Damit ich die Sachen rauslesen kann, erstelle ich zunächst eine Liste mit den Transport- und Arbeitsgängen.

```
List ArbeitsgnTransport = org.jdom.xpath.XPath.selectNodes(aplan,
                           "//*[local-name()='arbeitsplan']/*[local-name()='arbeitsgang' or local-name()        
                                ='transportArbeitsgang']");
```
Ich brauche aber eine Liste mit den Texteigenschafte und Numeigenschaften für jeden einzelnen Agang, deswegen erzeuge ich eine 2 Liste mit den Unterelemente des temp Elements der ersten Liste:


```
List ArbeitsgnTransport = org.jdom.xpath.XPath.selectNodes(aplan,
                       "//*[local-name()='arbeitsplan']/*[local-name()='arbeitsgang' or local-name()
                        ='transportArbeitsgang']");
                       Iterator iteratorArbeitsgnTransport =ArbeitsgnTransport.iterator(); 

                       
                       while(iteratorArbeitsgnTransport.hasNext()) 
                         {          
                        	 Element tempElement = (Element)iteratorArbeitsgnTransport.next();
                        	 System.out.println(tempElement);
                        	 Element hilfs=tempElement.getChild("eigenschaften",ns);
                        	 List Arbeitsgn = org.jdom.xpath.XPath.selectNodes(hilfs,
                        	 "//*[local-name()='eigenschaften']/*[local-name()='numEigenschaft' or local-name()
                                    ='texteigenschaft']");
                             
                        	  System.out.println(Arbeitsgn);
                        	 }
```
So nun müsste ich nach meiner Denkweise nach jedem durchlaufen der Liste, meine Liste beim 1 Agang mit 2 werten, beim 2Agang mit 3 Werten angezeigt bekommen!oder?? ???:L 
Ist aber nicht so, da ich jedesmall die Elemente aller Arbeitsgänge bekomme  
Woran liegt es denn???Habe ich irgend wo einen Denkfehler??


----------

