# JDOM - letzem child Attribut hinzufügen



## esmeralda (30. Jan 2010)

Hallo Allerseits, 

ich steh gerade total auf dem Schlauch und bin wieder etwas aus JDOM raus...

Mein Problem ist folgendes. Ich habe eine XML-Datei, bei der ich dem allerletzten child ein weiteres Attribut hinzufügen will. Ich weiß anfangs nicht, wie tief dieses child geschachtelt ist. Hier mal ein Auszug aus einer möglichen Datei:


```
<RULESET>
   <RULE S="NP" EXCEP="1">
      <node cat="NP"
         <word pos="Pgen" />   
          <node cat="PPgen">
               <word pos="VN" /> 
          </node>
      </node>
   </RULE>
</RULESET>
```

Hier soll nun dem letzten Element "word" (mit pos=VN) ein weiteres Attribut "form=bla" hinzugefügt werden. Bisher hab ich immer direkt auf ein child zugegriffen, aber wenn ich ja nicht weiß, was alles für Knoten vorangehen, klappt das ja nicht, oder?

Hier ein Auszug, wie ich bisher auf z.B. das erste word zugegriffen hab:



```
Element root = doc.getRootElement();    
Element word = root.getChild( "RULE" ).getChild( "word" );
word.setAttribute("form", literal_found);
```

Schon mal vielen Dank für Ideen und Vorschläge, wie das klappen soll :reflect:


----------



## Marco13 (31. Jan 2010)

Klingt als könnte man das rerkursiv recht einfach machen - im Pseudocode

```
void addAttributeToLastChild(Node node)
{
    if (node has no children) addAttributeTo(node);
    else addAttributeToLastChild(node.getChild(index));
}
```
(und wenn du dich jetzt fragst, welcher "index" da übergeben werden muss: Das frage ich mich auch  - im Zweifelsfall muss man da mit einer Schleife über alle Children laufen)


----------



## esmeralda (31. Jan 2010)

Okay, werd gleich mal ein paar Testläufe starten und ein paar Ideen ausprobieren. Bin mal gespannt, wie das klappen wird. Werd auch mal schauen, wie bzw. ob das noch zusammen mit XPath einfacher/schneller zu gestalten ist, bin aber noch unsicher, ob das überhaupt klappen kann :bahnhof:. Also Augen zu und durch und hoffentlich klappt das heute noch richtig ^^;


----------



## Marco13 (31. Jan 2010)

Ja, XPath kam mir auch in den Sinn, aber ich habe bisher nur rudimentärst (!) angefangen (!) mich damit zu beschäftigen... ich _weiss_ nicht, ob man damit so "Regex-Mäßig" sagen kann
getPath("node/word/[beliebigOftBisZumBlatt]")
könnte mir aber vorstellen, dass es sowas gibt... vielleicht weiß da ein XPath-Experte genaueres drüber...


----------



## esmeralda (31. Jan 2010)

Wenn ich den Knoten direkt anspreche, müsste das hier gehen:

[XML]//descendant-or-self::word[last()][/XML]

Aber dann hab ich ja nicht das komplette Dok, um es neu abzuspeichern. Also würde ich glaub ich eher einfach das hier

[XML]//descendant-or-self::*[/XML]

machen und dann auf die gefundene Knotenmenge im Nodeset ein getLength(). So kann ich dann den letzten Knoten im Nodeset ansprechen (hoff ich mal). 
Ich bin halt nur unsicher, ob ich dann nach dem Abspeichern als neues XML-Dok auch wirklich die gesamte Datei wieder hab, oder nur das geänderte Element. Aber genug gequatscht - ich sollte wohl einfach mal ausprobieren. Geh gleich nach Hause an meinen PC und versuch mich dran. XML, JDOM und XPath schaffen  es irgendwie regelmäßig einen Knoten in mein Hirn zu zaubern .


----------

