# Verschachtelung gleichnamiger Elemente



## RoHo (15. Sep 2011)

Hallo,

ich möchte in einer xml-Datei gleichnamige Elemente verschachteln, sowas wie:
[XML]
<document>
<element name = "element1">
  <...>...</...>
  <element name ="element2">
    <...>...</...>
  </element>
<element>
</document>
[/XML]

Wenn ich den <document>-Knoten nach <element> durchsuche, werden mir element1 und element2 angezeigt, wenn ich element1 nach <element> durchsuche findet er nix.

Ich benutze dazu DocumentBuilder/Factory zum Einlesen der Datei, 
zum Suchen der Knoten:

```
NodeList nl = node.getElementsByTagName("...");
```
zum Auslesen des Wertes:

```
private static String getTextValue(Element elem, String s){
		String textVal = null;
		NodeList nl = elem.getElementsByTagName(s);
		if(nl != null && nl.getLength() > 0) {
			Element el = (Element)nl.item(0);
			textVal = el.getFirstChild().getNodeValue();
		}

		return textVal;
	}
```


Geht das irgendwie ohne größere Umstellungen? Ich benutze das erste Mal xml und kenne mich da nicht wirklich aus, bitte kein Fachchinesich.

Gruß RoHo


----------



## Tomate_Salat (15. Sep 2011)

Was würde gegen solch eine Struktur sprechen:
[xml]
<root>
   <elements name="liste">
       <element name="a">...</element>
   </elements>

   <!-- oder -->
   <elementlist name="liste">
       <element name="a">...</element>
   </elementlist>
</root>
[/xml]


----------



## RoHo (15. Sep 2011)

naja, eigentlich war das ziel eine (theoretisch) unbegrenzte aber dynamische verschachtelungstiefe zu erreichen, also ein <element> hat kein unterelement, das nächste hat zwei unterelemente, das nächste einen usw.
ich wüsste im moment nicht wie sich das mit der liste umsetzen ließe

€: ich sehe die verschachtelung bei dir gerade nicht


----------



## RoHo (15. Sep 2011)

eine Möglichkeit wäre natürlich die elmente auf xml-Ebene gleichrangig zu behandeln und als Attribut eine Verschachtelungstiefe anzugeben, aber dann müsste ich den Programm-Code natürlich ändern und das da behandeln
zum Lesen des xml-Dokuments ist das auch nicht vorteilhafter, wenn noch jemand eine Idee hat bitte melden, sonst mache ich den Thread morgen zu

Gruß Ro


----------



## RoHo (18. Sep 2011)

Hallo,

da es leider keine weiteren Vorschläge gab, bin ich das PRoblem ein wenig umgangen, hier meine Idee (falls es jemanden interessiert)
Am Anfang der xml-Datei habe ich eine Tiefe stehen, wie hoch die maximale Verschachtelung ist, und in jedem Element steht die aktuelle Verschachtelungstiefe mit drin.
[XML]
<tiefe>2</tiefe>
<element name = "..." tiefe = 0>erstes elment</element>
<element name =",,," tiefe = 1>unterlement des elmentes ...</elment>[/XML]

usw...
Im Prgramm ein ein Array der Größe [tiefe] und dort dann jeweils das aktuelle oberlement reingeschrieben, bzw. ausgelesen...

Gruß Ro


----------



## Spacerat (18. Sep 2011)

Bin jetzt nicht ganz so firm in XML aber soweit ich weis, musst du in der Dokumenttypdefinition (dtd) bzw. Shema (xsd) angeben, dass ein Element auch Seinesgleichen beinhalten darf. Ganz ohne Dokumentbeschreibung aber sollte es so funktionieren, wie in deinem 1. Beispiel, allerdings ohne Leerzeichen bei "=". Also[XML]<document>
<element name="element1">
  <...>...</...>
  <element name="element2">
    <...>...</...>
  </element>
<element>
</document>[/XML]


----------



## mvitz (18. Sep 2011)

Also bei mir funktioniert das. Wenn ich folgendes XML habe:
[XML]<?xml version="1.0" encoding="UTF-8" ?>
<document>
  <element name="1">
    <element name="1.1" />
    <element name="1.2" />
  </element>
  <element name="2" />
  <element name="3">
    <element name="3.1" />
  </element>
</document>[/XML]

Und ich rufe auf dem Element, das element name="1" representiert getElementsByTagName("element") auf, dann bekomme ich eine NodeList mit der Länge 2 zurück.

Man muss natürlich beachten, dass wenn man dasselbe auf dem document Element aufruft, dann bekommt man nicht 3 sondern 6 zurück!


----------



## RySa (22. Sep 2011)

also auf die schnelle würde mir die suche mit Hilfe von XPath einfallen. Da kannst du dann z.B nach "//element/element"...usw suchen und kriegst dann nur das letzte angegebene Element zurück. Wenn du aber nach "//element" suchst, wirst du (solltest zumindest, soweit ich mich erinnern kann) dann das Element und all dessen Unterelemente zurückbekommen. Kann sein dass ich dich ein wenig missverstanden habe und du was ganz anderes suchst, wollte es nur mal so vorschlagen, falls es doch helfen sollte 

Ps. Die Syntax für das XPath kann von den von mir angegebenen Beispielen ein bisschen abweichen, es ist schon spät 

Gruß


----------

