# jdom zu lasch ?



## phips.net (28. Apr 2005)

hallo gruppe,

kann es sein, dass ich mit jdom, falls sich jemand damit auskennt, nicht auf geschwisterknoten zugreifen kann ?
der problemfall in der praxis sieht folgendermaßen aus:

mein xml:

<start>
___<kind>
______<kindeskind id="a">bla</kindeskind1>
______<kindeskind id="s">bla</kindeskind1>
______<kindeskind id="f">bla</kindeskind1>
___</kind>
___<kind>
______<kindeskind id="m">bla</kindeskind1>
______<kindeskind id="k">bla</kindeskind1>
______<kindeskind id="l">bla</kindeskind1>
___</kind>
</start>


vorrausgesetzt sei hier mal, dass ich an diese struktur und an jdom gebunden bin; 

gibt es eine mglk., eine liste oä. aller kindeskinder zu bekommen, die zwischen den <kind> bloecken stehen ?


falls das tatsaechlich mit jdom nicht moeglich sein sollte - womit ginge es (einfach & schnell) ?


vielen lieben dank.
.p


----------



## Roar (28. Apr 2005)

jedes kind durchgehen und davon die kinder holen.


----------



## phips.net (28. Apr 2005)

nette idee, aber wie 'hangel' ich mich von einem <kind> zum 
naechsten. eine methode nextSibling() oä. gibts nicht...oder sehe ich den wald vor lauter baeumen nicht ? :?:


----------



## Roar (28. Apr 2005)

start.getChildren("kind");


----------



## phips.net (28. Apr 2005)

...liefert mir aber nur eine liste der kindeskinder aus dem ersten <kind> block...


----------



## Roar (28. Apr 2005)

nein, das liefert dir alle kind elemente im start element vorausgesetzt start referenziert auch auf das startelement


----------



## clemson (28. Apr 2005)

dann mach eine xpath abfrage mit jdom.


```
org.jdom.Document doc;
org.jdom.xpath.XPath myXPath = XPath.newInstance("//kindeskind");
java.util.List liste = myXpath.selectNodes( doc );
```


----------



## phips.net (28. Apr 2005)

an xpath habe ich auch schon gedacht; hatte noch nie damit zu tun.
kannst du mir vielleicht auf die spruenge helfen, wie ich damit parat komme ?
dein bsp. spricht ja eigentlich fuer sich. wo sage ich denn, welche knoten ich haben will ?
und, was viel wichtiger ist: angenommen <start> hat noch kinder, die <adoptivkinder> heissen, die wiederum <kind> tags haben, so moechte ich sichergehen, dass ich NUR die kindeskinderelemente von den <kind> knoten bekomme und nicht die der <adoptivkind> knoten. bin mir fast sicher, dass das auch geht. aber wie ?

was waere die welt ohne foren ? bzw. man sollte euch allen, die hier hilfreich sind, mal beizeiten einen orden verleihen ?


----------



## clemson (28. Apr 2005)

also, erstmals ein gutes xpath tutorial .

wenn ich dein beispiel richtig verstanden habe, dann möchtest du nur kindeskind elemnte, welche das mutterelement kind haben, richtig?

dann lautet die abfrage: "//kind/kindeskind"

das // bedeutet dass er alle elemente auswählt kind/kindeskind bedeutet dann eben, dass er alle elemente auswählt, welche diese struktur haben (also selber kindeskind heissen und eine mutter haben die kind heisst).

willst du beispielsweise das kindeskind element, welches die id f hat, dann kannst du mittels xpath abfrage

"//kindeskind[@id='f']" dieses element auswählen, aber im tutorial ist das ganz gut beschrieben.


----------



## phipsnet (28. Apr 2005)

ginge //kind/kindeskind auch bei mehreren <kind> bloecken ?

also:
<kind>
__<kindeskind>
__<kindeskind>
__<kindeskind>
</kind>
<kind>
__<kindeskind>
__<kindeskind>
__<kindeskind>
</kind>

das solls dann gewesen sein - danke fuer den link - wird sogleich studiert.


----------



## clemson (28. Apr 2005)

phipsnet hat gesagt.:
			
		

> ginge //kind/kindeskind auch bei mehreren <kind> bloecken ?



hmm, ich denke schon, aber 100% sicher bin ich mir nicht.

probiers doch aus, oder - wenn du mit eclispe arbeitest - lade dir einen xpath-explorer herunter, mit dem kannst du bequem deine xpath ausdrücke an einer xml dateie überprüfen --> link zu einem plugin für eclipse


----------



## clemson (28. Apr 2005)

habs gerade ausprobiert, //kind/kindeskind geht auch bei mehreren kind blöcken


----------



## phipsnet (28. Apr 2005)

nur ums auszuprobieren, hab ich die drei zeilen aus deiner ersten antwort mal eingehackt,
aber bei  List variantDrafts = Xpath.selectNodes( doc ); meckert mein compiler 

--> cannot find symbol 
symbol  : variable Xpath
location: class Import
        List draftsVariants = Xpath.selectNodes( doc );

hab natuerlich vorher
XPath myXPath = XPath.newInstance("//header/draft/variant"); gesetzt... hmmm

nach 9 std. java raucht mir grad die birne...


----------



## clemson (28. Apr 2005)

deine variable heisst myXPath und nicht XPath!

vielleicht habe ich dich da ein bisschen verwirrt, also:

mit

```
XPath myXPath = XPath.newInstance("//header/draft/variant");
```

legst du eine neue XPath abfrage fest.

mit 


```
List draftsVariants = myXPath.selectNodes( doc );
```

wendest du deine abfrage bei einem speziellen dokument an (in diesem fall doc).

und dann steht in draftVariants alle ergebnisse deiner xpath abfrage drinnen.

wie du vielleicht weisst ist jdom auf klassen aufgebaut; d. h mittels


```
for (int i=0, int anzahl = draftsVariants.size(); i<anzahl; i++ )
{
    System.out.println(i+". tes Element der Abfrage: '"+draftsVariants.get(i).getClass().toString()+"'");
}
```

kannst du dir die typen der einzelnen abfragen ausgeben (element, text, attribute, ...)


----------



## Roar (28. Apr 2005)

hmm an xpath hab ich gar nich gedacht


----------



## phipsnet (28. Apr 2005)

jetzt gehts !!
einen schoenen feierabend !
    :lol:   8)


----------



## clemson (28. Apr 2005)

phipsnet hat gesagt.:
			
		

> jetzt gehts !!
> einen schoenen feierabend !
> :lol:   8)



ja fein, dir auch.

und nochmal zu deiner ursprünglichen überschrift und der frage, ob jdom zu lasch sei.

also ich habe die letzten monate eine diplomarbeit geschrieben, welches mittels java die manipulation von xml dateien zulässt. da war natürlich die frage, welche schnittstelle verwenden wir zwischen java programm und xml datei und wir haben uns für jdom entschieden.

ich habe die erfahrung gemacht dass mittels jdom wirklich eine feine bearbeitung von xml realisierbar ist, weil - so finde ich jedenfalls - jdom sehr logisch und gut aufgebaut ist.

durch die kombination mit xpath sind wirklich viele anwendungsfälle möglich.

wollt ich nur mal so sagen...


----------

