Frage

Ist es möglich, XPath zu verwenden nur die Knoten auszuwählen, die ein bestimmtes Kind-Elemente haben? Zum Beispiel aus dieser XML mag ich nur die Elemente in Haustieren, die ein Kind von ‚bar‘ haben. So ist die resultierende Datenmenge der lizard und pig Elemente aus diesem Beispiel enthalten würde:

<pets>
  <cat>
    <foo>don't care about this</foo>
  </cat>
  <dog>
   <foo>not this one either</foo>
  </dog>
  <lizard>
   <bar>lizard should be returned, because it has a child of bar</bar>
  </lizard>
  <pig>
   <bar>return pig, too</bar>
  </pig>
</pets>

Dieses Xpath gibt mir alle Haustiere: "/pets/*", aber ich möchte nur die Tiere, die einen untergeordneten Knoten des Namens 'bar' haben

.
War es hilfreich?

Lösung

Hier ist er, in seiner ganzen Pracht

/pets/*[bar]

Englisch: Gib mir alle Kinder von pets, die ein Kind bar haben

Andere Tipps

/pets/child::*[child::bar]

Meine Verzeihung, ich habe nicht die Kommentare der vorherigen Antwort.

Aber in diesem Fall würde ich eher vorziehen, die descendant:: Achse verwenden, die alle Elemente nach unten aus dem angegebenen beinhaltet:

/pets[descendant::bar]

Für den Fall, Sie wollten mehr spezifisch über die Kinder sein -. Sie auch Selektoren auf sie verwenden können

Beispiel:

<pets>
    <cat>
        <foo>don't care about this</foo>
    </cat>
    <dog>
        <foo>not this one either</foo>
    </dog>
    <lizard>
        <bar att="baz">lizard should be returned, because it has a child of bar</bar>
    </lizard>
    <pig>
        <bar>don't return pig - it has no att=bar </bar>
    </pig>
</pets>

Nun, Sie kümmern sich nur um alle pets jedes Kind bar mit , die ein Attribut att mit Wert hat baz . Sie können den folgenden XPath-Ausdruck verwenden:

//pets/*[descendant::bar[@att='baz']]

Ergebnis

<lizard>
    <bar att="baz">lizard should be returned, because it has a child of bar</bar>
</lizard>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top