132 Stimmen

Knoten ermitteln, deren untergeordneter Knoten ein Attribut enthält

Angenommen, ich habe die folgende XML-Datei:

<book category="CLASSICS">
  <title lang="it">Purgatorio</title>
  <author>Dante Alighieri</author>
  <year>1308</year>
  <price>30.00</price>
</book>

<book category="CLASSICS">
  <title lang="it">Inferno</title>
  <author>Dante Alighieri</author>
  <year>1308</year>
  <price>30.00</price>
</book>

<book category="CHILDREN">
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

<book category="WEB">
  <title lang="en">XQuery Kick Start</title>
  <author>James McGovern</author>
  <author>Per Bothner</author>
  <author>Kurt Cagle</author>
  <author>James Linn</author>
  <author>Vaidyanathan Nagarajan</author>
  <year>2003</year>
  <price>49.99</price>
</book>

<book category="WEB">
  <title lang="en">Learning XML</title>
  <author>Erik T. Ray</author>
  <year>2003</year>
  <price>39.95</price>
</book>

Ich möchte einen xpath, der alle Buchknoten zurückbekommt, die einen Titelknoten mit einem Sprachattribut von "it" haben.

Mein Versuch sah in etwa so aus:

//book[title[@lang='it']]

Aber das hat nicht funktioniert. Ich erwarte, dass ich die Knoten zurückbekomme:

<book category="CLASSICS">
  <title lang="it">Purgatorio</title>
  <author>Dante Alighieri</author>
  <year>1308</year>
  <price>30.00</price>
</book>

<book category="CLASSICS">
  <title lang="it">Inferno</title>
  <author>Dante Alighieri</author>
  <year>1308</year>
  <price>30.00</price>
</book>

Irgendwelche Hinweise?

201voto

lavinio Punkte 23413

Versuchen Sie

//book[title/@lang = 'it']

Dieser lautet:

  • alle bekommen book Elemente
    • die mindestens eine title
      • das ein Attribut hat lang
        • mit einem Wert von "it"

Sie finden vielleicht cette hilfreich - es ist ein Artikel mit dem Titel "XPath in fünf Absätzen" von Ronald Bourret.

Aber mal ganz ehrlich, //book[title[@lang='it']] und das obige sollte gleichwertig sein, es sei denn, Ihre XPath-Engine hat "Probleme". Es könnte also etwas im Code oder im XML-Beispiel sein, das Sie uns nicht zeigen - zum Beispiel ist Ihr Beispiel ein XML-Fragment. Könnte es sein, dass das Root-Element einen Namespace hat und Sie diesen in Ihrer Abfrage nicht berücksichtigen? Und Sie haben uns nur gesagt, dass es nicht funktioniert hat, aber Sie haben uns nicht gesagt, welche Ergebnisse Sie erhalten haben.

64voto

wes.hysell Punkte 1139

Jahre später, aber eine nützliche Option wäre die Verwendung von XPath-Achsen ( https://www.w3schools.com/xml/xpath_axes.asp ). Genauer gesagt, wollen Sie die Nachkommen Achsen.

Ich glaube, dieses Beispiel würde den Zweck erfüllen:

//book[descendant::title[@lang='it']]

Auf diese Weise können Sie alle book Elemente, die ein Kind enthalten title Element (unabhängig davon, wie tief es verschachtelt ist), dessen Sprachattribut den Wert "it" hat.

Ich kann nicht mit Sicherheit sagen, ob diese Antwort für das Jahr 2009 relevant ist oder nicht, da ich mir nicht zu 100 % sicher bin, dass die XPath-Achsen zu diesem Zeitpunkt existierten. Was ich bestätigen kann, ist, dass es sie heute gibt, und ich habe sie als äußerst nützlich für die XPath-Navigation empfunden, und ich bin sicher, Sie werden das auch tun.

15voto

vtd-xml-author Punkte 3234
//book[title[@lang='it']]

ist eigentlich gleichbedeutend mit

 //book[title/@lang = 'it']

Ich habe es mit vtd-xml versucht, beide Ausdrücke spucken das gleiche Ergebnis aus... Welche xpath-Verarbeitungsmaschine haben Sie verwendet? Ich vermute, es hat ein Konformitätsproblem Unten ist der Code

import com.ximpleware.*;
public class test1 {
  public static void main(String[] s) throws Exception{
      VTDGen vg = new VTDGen();
      if (vg.parseFile("c:/books.xml", true)){
          VTDNav vn = vg.getNav();
          AutoPilot ap = new AutoPilot(vn);
          ap.selectXPath("//book[title[@lang='it']]");
                  //ap.selectXPath("//book[title/@lang='it']");

          int i;
          while((i=ap.evalXPath())!=-1){
              System.out.println("index ==>"+i);
          }
          /*if (vn.endsWith(i, "< test")){
             System.out.println(" good ");  
          }else
              System.out.println(" bad ");*/

      }
  }
}

4voto

Joakim Byg Punkte 41

Ich würde meinen, dass Ihr eigener Vorschlag richtig ist, aber die xml ist nicht ganz gültig. Wenn Sie die //book[title[@lang='it']] en <root>[Your"XML"Here]</root> dann die kostenlosen Online-xPath-Tester wie z.B. ein aquí findet das erwartete Ergebnis.

2voto

user1113000 Punkte 45

Versuchen Sie, diesen xPath-Ausdruck zu verwenden:

//book/title[@lang='it']/..

Damit sollten Sie alle Buchknoten in "it" lang erhalten

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X