# XML Dynamisch



## yidaki (19. Juli 2004)

Hallo zusammen, hab hier ein kleines Problem... Ich will ne XML Datei auslesen, was ja eigentlich kein problem ist, aber es soll halt so funktionieren und die Namen der Attribute explizit aufzurufen...


```
public static void vergleich(Document doc, Document oDoc){
	Element docElement = doc.getRootElement();
	Element oDocElement = doc.getRootElement();
                     //Liefert die Attribute.... brauche den inhalt jedes einzelnen Attributes
                     //Beispieltag 
                     //<banking-view id="0"  name="VorgÃ¤nge.SichtB"  version="1.5"  >
	List test = docElement.getAttributes();
                     ?
```

Ich bräuchte von den Attributen den namen und den inhalt in 

mfg


----------



## squeaker (19. Juli 2004)

Document docu
Element root=docu.getDocumentElement(); liefert dir als erstes das root Element

Element implementiert Node. Mit Node hast du Zugriff auf alle Kinder via: getChildNodes();

Dieses liefert eine NodeList zurück.

zusätzlich hat ein Element noch Zugriff auf seine Attribute via: getAttributes();
welches sich auch im NodeInterface befindet. Rückgabewert: NamedNodeMap.
Da hast du Zugriff auf alle Attribute des Elements via: getLength() und item(index i), sprich über eine For-Schleife kommst du an alle Attribute, egal welchen Namen sie haben.

Noch Fragen?


----------



## yidaki (19. Juli 2004)

Das hört sich erstmal ziemlich gut an... werd auf jeden fall mal ausprobieren... 

ich bin gerade dabei und hab mir die attribute als list zurückgeben lassen und verusche diese nun mit sublist und zwei forschleifen zu vergleichen.... ist aber warscheinlich nicht die eleganteste lösung... daher werd ich mich sobald ich fertig bin mit deinem code beschäftigen..

merci

gruß


----------



## yidaki (19. Juli 2004)

Habs mir grad anschauen wollen aber kann irgendwie mit node nicht wirklich was anfangen... also

```
Node test = new Node()
```
funktioniert die implementierung jedenfalls nicht... vielleicht kannst du mir dies bezüglich doch nochmal weiterhelfen


thx


----------



## squeaker (19. Juli 2004)

node ist ein Interface - interfaces kannst du nicht mit Node generieren. Du musst ein Element (welches auch ein Node ist) generieren.


----------



## JThan (19. Juli 2004)

Hi!

WIr lesen auch XML-Files aus, und haben das ca. so wie unten geschrieben verwirklicht.

doc steht dabei für ein Document-Objekt


> DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
> dbf.setValidating (true);
> DocumentBuilder db = dbf.newDocumentBuilder();
> System.out.println ("is validating: " + db.isValidating());
> doc = db.parse (getDoc());



Jetzt gehen wir mit einer Schleife jedes Element durch und schauen, ob es die Informationen enthält, die wir verarbeiten können. Das kann für dich so jetzt unbrauchbar sein, aber es zeigt zumindest, wie du auf einzelne Elemente nach der reihe zugreifen kannst.



> for (int i = 0; i < x; i++)
> {
> 
> 
> ...



Ist vll. etwas umständlich, aber es funktioniert zumindest.

Mit Abfragen wie:



> doc.getDocumentElement().getChildNodes().item (i).getChildNodes().item (1).getChildNodes().toString();



kann man nun tiefer einsteigen, wobei Variablen anstelle von Konstanten wie hier die 1 für deine Zwecke vll.besser sind... Mehrfach geschachtelte for-Schleifen, wie herrlich 

Hoffe dir damit weitergeholfen zu haben und nicht das Thema verfehlt zu haben.

MfG
Johnny


----------



## yidaki (20. Juli 2004)

squeaker hat gesagt.:
			
		

> Document docu
> Element root=docu.getDocumentElement(); liefert dir als erstes das root Element


doco.getDocumentElement() gibts bei mir nicht!
Element root  = doco.getRootElement() habe ich benutzt...


			
				squeaker hat gesagt.:
			
		

> Element implementiert Node. Mit Node hast du Zugriff auf alle Kinder via: getChildNodes();


Kann nicht auf nodes zugreifen
also root.getChildNodes(); fuktioniert nicht


----------



## squeaker (20. Juli 2004)

Welche api benutzt du?


----------



## yidaki (20. Juli 2004)

JDOM 1.0 und J2SKD1.4.1_02


```
<banking-view id="0" name="Vorgänge.SichtA" version="1.5">
```
Hab mir die Attribute in einer Liste ausgeben lassen...

```
Element root = oDoc.getRootElement();
System.out.println(root);
List list = root.getAttributes();
```
ich will die attribute mit den attributen einer anderen datei vergleichen...


----------



## Thomas Darimont (20. Juli 2004)

Nur mal nebenbei ... ich empfehle dom4j 
http://www.dom4j.org/

Gruß Tom


----------



## yidaki (20. Juli 2004)

Werd ich mir zu Hause mal ansehen ;-)


----------



## squeaker (20. Juli 2004)

entschuldige bitte - meine Hinweise gelten für: javax.xml.* und Unterpakete.

@Thomas: was sind die Vorteile zum Standard-Paket?


----------



## yidaki (20. Juli 2004)

Also ich (mit ein bisschen Hilfe) habs jetzt so hinbekommen, dass ich mir ne liste ausgebe diese als attribut caste und dann den namen bzw. den text ausgeben lassen kann.


```
Element rootA = documentA.getRootElement();
Element rootB = documentB.getRootElement();
List listOrginal = rootA.getAttributes();
List listVergleich = rootB.getAttributes();


for (int i = 0 ; i < listOrginal.size(); i++){
	Attribute attr1 = (Attribute) listOrginal.get(i);
	for (int j = 0 ; j < listVergleich.size(); j++) {
		Attribute attr2 = (Attribute) listVergleich.get(j);
		if (attr1.getName().equals(attr2.getName())){
			System.out.println(attr1.getName()+ " equals "+ attr2.getName());
		}else{
			System.out.println("tset");
		}
	}
}
```

Hat sich allerdings ein neues Problem ergeben... ich möchte wie man in der for-schleife sieht die Attributnamen miteinander vergleichen... das problem was sich ergibt ist, dass bei dem schleifen durchlauf jedes mal false zurückgegeben wird auch wenn das attribut enthalten ist....


----------

