2010-12-27 14 views
3

Suche ich eine tief verschachtelte Struktur (Parsing tatsächlich xhtml aus, so viele böse), etwa so:einen benachbarten Knoten in XML durch XPath

<tr> 
    <td> 
    <font id="blah"> 
     stuff 
    </font> 
    </td> 
</tr> 
<tr> 
    <td> 
     more stuff 
    </td> 
</tr> 

und dies wiederholt sich in einem langen Tisch. Ich brauche einen XPath-Ausdruck, der das zweite Font-Tag auswählt (oder besser text()). Ich schaute auf die Achse preceding-sibling, aber etwas funktioniert nicht ganz richtig.

etwas entlang der Linien von (und mir verzeihen, wenn dies lächerlich ist, meine XPath ist rostig)

//tr[preceding-sibling::tr/td/font]/td/text() 
+0

Gute Frage, +1. Siehe meine Antwort für einen kurzen XPath-Ausdruck, der genau den gewünschten Textknoten auswählt. :) –

Antwort

5

Verwendung:

(//tr/td[font])[2]/font/text() 

Das bedeutet:

Wählen Sie alle Text-Knoten Kinder aller font Elemente, die Kinder der zweiten td im Dokument, das ein font Kind hat und ist selbst ein Kind von einigen tr Element.

Wie Sie sehen können, ist keine preceeding Achse erforderlich.

+0

oh, das funktioniert auch. Ich fand heraus, was mit mir los war - es funktionierte, aber packte * alle * Reihen, die dem ersten tr folgten. ich änderte es zu // tr [vorhergehendes-gleichgeschlecht :: tr [1]/td/schrift]/td/text(), und das hat auch funktioniert. im Grunde benötigt, um zu spezifizieren, dass ich das vorhergehende Geschwister zur ersten Reihe wünschte. Deines ist jedoch viel einfacher. – kolosy

0

Du hast die richtige Idee. Es sollte funktionieren, wenn Sie die /b dort loswerden.

+0

yeah - das/b ist ein Fehler beim Kopieren/Einfügen. Es ist in der tatsächlichen Ausdruck benötigt, aber nicht in meinem Beispiel hier. – kolosy

Verwandte Themen