# XML- Datei einlesen



## PollerJava (20. Jun 2007)

Hallo,

meine XML- Dateienstruktur schaut momentan so aus wie unten dargestellt. Ich möchte jetzt in die XML- Datei nochwas dazufügen, das aber irgendwie extra sein sollte, z.B.: <Preferences1> und <Preferences2>

Wie lasst sich das einfach realisieren?
Vielleicht hat jemand eine Idee.

Danke.

lg 


<Preferences>  
    <Element type="text1" id="0">
             <varID type="init1" id="0"> 
			<State id="0">
                        </State>
             </varID>
   </Element>
   <Element>
    usw.....
   </Element>
</Preferences



SO frage ich mom. ab: 



```
private Vector<ElementState> readStates(String xmlFile) throws JDOMException, IOException 
	{
	Vector<ElementState> vStates= new Vector<ElementState>();			
	SAXBuilder builder = new SAXBuilder();	
	Document doc = builder.build(xmlFile);
        Element root = doc.getRootElement();
        
	Iterator iElements = root.getChildren("Element").iterator();
	while (iElements.hasNext())                                            
	    {
	    Element element = (Element) iElements.next();	
	    Iterator iVarID = element.getChildren("varID").iterator();
	    while (iVarID.hasNext())
		{
		Element varID = (Element) iVarID.next();
		Iterator iStates = varID.getChildren("State").iterator();  
		while (iStates.hasNext())					
		    {
```


----------



## kama (20. Jun 2007)

Hallo,

schon mal XStream oder XMLBeans angeschaut?

MfG
Karl Heinz Marbaise


----------



## Faruun (20. Jun 2007)

Hallo,

also xml-Dateien können meines Wissens nur ein root-Element haben. Dementsprechend würde das hier nicht gehen:


```
<Preferences>
<Element type="text1" id="0">
<varID type="init1" id="0">
<State id="0">
</State>
</varID>
</Element>
<Element>
usw.....
</Element>
</Preferences>
<Preferences1>
</Preferences1>
```

Dazu müsstest Du ein root-Element rumbauen.
Die Datei müsste dann so aussehen:


```
<root>
<Preferences>
<Element type="text1" id="0">
<varID type="init1" id="0">
<State id="0">
</State>
</varID>
</Element>
<Element>
usw.....
</Element>
</Preferences>
</root>
```


Darunter kannst Du dann via JDOM problemlos weitere Elemente anfügen.
Mal freihändig:


```
Element newElement = new Element("Preferences1");
root.addContent(newElement);
```

Ich hoffe das war es, was Du meintest.

Gruß,
Faruun


----------



## PollerJava (20. Jun 2007)

Vielen Dank!!,


ich hätte noch eine Frage zum Einlesen einer XML- Datei und zwar habe ich fplgenden aufbau wie unten dargestellt:

Im Programm suche ich jetzt eben nach panel und speichere es dann in ein Objekt, 

Mein Problem ist jetzt, dass ich nicht weiß, wieviel panels es gibt (unten sind es 3) und wenn alle den gleichen Namen haben, dann speichere ich nur eins davon (das letzte eben).
Wie könnte ich das machen, dass ich beliebig viele <panel> in der XML- Datei anführen kann und diese auch in meinem Objekt dann gespeichert werden?

Danke für die immer hilfreichen Antworten!!

lg




```
if (state.getName().equals("panel"))
                            newState.setPanel(state.getText().trim());
```


```
<State id="0">
				<panel>				PanelA				</panel>
				<panel>				PanelB				</panel>
				<panel>				PanelC				</panel>
			</State>
```


----------



## Faruun (20. Jun 2007)

Du kannst doch mit einer Schleife durchzählen lassen. Ich versteh das Problem grad nicht so ganz. ???:L
In Deinem Document hast Du doch die gesamte xml-Struktur im Zugriff und mit JDOM hast Du viele Möglichkeiten, diese zu bearbeiten, zu durchsuchen etc.

Schau Dir mal die API an: http://www.jdom.org/docs/apidocs/index.html

Gruß,
Faruun


----------



## PollerJava (20. Jun 2007)

Mein Problem ist, ich laufe die <States> durch und möchte die panels mit der Methode setPanel des Objektes newState speichern. Leider wird momentan bei mir nur ein panel gespeichert -> ich habe drei <panel> und mit der Methode setPanel() schreibe ich aber immer wieder drüber. Ich weiß eben nicht wie ich das machen kann damit ich alle drei Panels speichere (bzw. natürlich deren Namen)

Vielleicht weiß da jemand Abhilfe.

Vielen Dank


```
while (iPrefs.hasNext())					
			{
			Element state = (Element) iPrefs.next();  
                        if (state.getName().equals("panel"))
                             newState.setPanel(state.getText().trim());
```


----------



## Faruun (20. Jun 2007)

Mal so aus der Hand ...

also ... ich würde mir das Element states holen ... das hast Du ja scheinbar schon, korrekt?

So ... dann brauchst Du erstmal alle children ... also:


```
List <Element> listOfChildren = state.getChildren("panel");
```

so ... nun hast du automatisch eine Liste mit allen Children namens panel.
nun kannst Du Deine Objekte bauen, und zwar so lange Du noch Elemente in der Liste hast.


```
for (Iterator i = listOfChildren.iterator(); i.hasNext();) {
      Element e = (Element) i.next();
...
}
```

Da hast Du Dein einzelnes Element und mit dem kannst Du nun was weiß ich anstellen 

Gruß,
Faruun


----------



## PollerJava (20. Jun 2007)

Nöö, das ist leider nicht mein Problem, 
Das Problem liegt schon beim speichern der <panel>, ich speichere beim ersten duchrlauf den ersten Eintrag von <panel> mit setPanel() und beim zweiten durchlauf der for- Schleife speichere ich diesen Eintrag wieder mit setPanel() und verliere somit den ersten Eintrag -> das sit eben mein Problem.


----------



## Faruun (20. Jun 2007)

Du verlierst das 1. setPanel(), obwohl es mit unterschiedlichen Objekten gemacht wird?  :bahnhof:


----------



## PollerJava (20. Jun 2007)

Nein, es ist ja das gleiche Objekt und ich möchte eben in diesem einem Objekt die 3 <panel> auslesen und in diesem Objekt gespeichert haben und wieß eben nicht genau, wie ich das machen kann.

Wenn ich es mit 
<panel1>
<panel2>
<panel3>

und setPanel1(), setPanel2() und setPanel3() machen würde gings ja, aber das kann ich nicht machen, da ich nicht weip, wieviele <panel> ich habe.

Ich hoffe ich konnte es jetzt besser erklären.

Vielen Dank für Eure/Deine Antworten auf jeden Fall.

lg


----------



## Faruun (20. Jun 2007)

Hmm ... okay ... ich versteh leider nicht mehr so wirklich, wohin Du willst.

Wenn ich nochmal auf die von mir vorgeschlagene for-Schleifen kommen darf:

Du hast jeweils die Objekte panel einzeln ... an der Zahl dann drei, wenn es denn drei sind. Wenn Du in der for-Schleife Dein setPanel() machst, dann sollte das doch funktionieren, oder?  ???:L  Ich kenn mich leider nicht so mit setPanel() aus ...

Warum willst Du denn alle drei panel in einem Objekt halten? JDOM verpflückt Dir das doch schon so schön in drei einzelne, unabhängig voneinander existierende Elemente.


----------



## user0001 (20. Jun 2007)

Wie wäre es damit, wenn du es so machst (mit for-Schleife) wie Faruun oben gesagt hat und du innerhalb dieser Schleife jedes panel zu einer Liste hinzufügst. Und nachdem du die Schleife durch hast, kannst du ja setPanel(meineListe) machen ... und da steht halt auch eine Liste dahinter.

Gruß

user0001


----------

