2016-07-24 18 views
2

Ich wurde kürzlich in die wunderbare Welt von XPath und XQuery eingeführt. Ich war in der Lage, einige Abfragen mit logischen Operatoren zu konstruieren, aber ich stecke an einem bestimmten Problem fest, für das ich keine Antwort zu finden vermag. Es beinhaltet Attribute, die um ein Tag gewickelt sind.Xpath & Xquery: Auswählen und Zurückgeben von XML-Elementen mit mehreren komplexen Tags

Ich verwende Exide, um ein XML-Dokument zu durchsuchen, und die Struktur sieht nicht aus wie etwas, das ich bei der Recherche gesehen habe. Es sieht aus (etwas) wie folgt aus:

<Report name="Report001"> 
    <ReportDetail name="SubSection1"> 
     <Properties> 
      <tag name="bar">blue</tag> 
      <tag name="bar2">green</tag> 
      <tag name="bar3">yellow</tag> 
      <tag name="bar4">white</tag> 
     </Properties> 
      <ReportItem detail1="some value" detail2="some value" detail3="some value" detail4="some value" detail5="some value"> 
       <item1>foo</item1> 
       <item2>foo2</item2> 
       <item3>foo3</item3> 
       <item4>foo4</item4> 
       <item5>foo5</item5> 
      </ReportItem> 
    </ReportDetail> 
    <ReportDetail name="SubSection2"> 
     <Properties> 
      <tag name="bar">blue</tag> 
      <tag name="bar2">green</tag> 
      <tag name="bar3">pink</tag> 
      <tag name="bar4">lime</tag> 
     </Properties> 
      <ReportItem detail1="some value2" detail2="some value2"detail3="some value2" detail4="some value2" detail5="some value2"> 
       <item1>foo</item1> 
       <item2>foo2</item2> 
       <item3>foo3</item3> 
       <item4>foo4</item4> 
       <item5>foo5</item5> 
      </ReportItem> 
     </ReportDetail> 
</Report> 

Was ich versuche zu suchen (und zählen) und dann in einer Abfrage zurückgeben ist diese ReportDetail Namen wo

  1. Tag-Namen bar2 Spiele
  2. den Tag selbst enthält (oder gleich) grün
  3. und item3 gleich foo3

Ich habe versucht, Variationen der folgenden Möglichkeiten: Für die ersten beiden Teile der Abfrage die folgenden Abfragen

count(//Properties/tag[@name='bar2'] | /tag[. ,'green'])) 

count//Properties/tag[@name='bar2'][. ,'green'])) 

count(//Properties[contains(@name, "bar2")]) 

für den dritten Teil der Abfrage denken produziert habe ich es wie eine von ihnen aussehen sollte:

and //ReportItem[item3=foo3])   

//ReportItem[item3=foo3] 

So ist die gesamte Abfrage würde wie folgt aussehen:

count(//Properties/tag[@name='bar2'] | /tag[. ,'green'] and /ReportItem[item3=foo3) 
+0

Bitte stellen Sie wohlgeformte XML-Dokumente (schließen Sie alle Elemente!) Zur Verfügung, die Ihnen nicht helfen, die Eingabe zu korrigieren, bevor sie dies tun können. Auch: Was hast du versucht, wo genau bist du stecken geblieben? Wie lautet die erwartete Ausgabe für die gesuchte Abfrage in den von Ihnen bereitgestellten Eingabedaten? Bitte werfen Sie einen Blick auf [fragen], um zu sehen, was in einer guten Frage enthalten sein sollte. –

+0

Vielen Dank für das Feedback, aktualisiert wie gewünscht. – chrishowden

+0

Ihre XPath-Ausdrücke haben '// HostProperties', aber Ihre XML-Eingabe enthält keine Elemente dieses Namens. –

Antwort

0

Ihre Xpath falsche Syntax hat. Ich denke, es sollte sein:

count(//Properties/tag[@name='bar2'] | //tag[.='green'] | //ReportItem[item3='foo3']) 
1

Sie haben das Problem nicht sehr genau angegeben. Nehmen wir an, dass, wenn Sie sagen:

Ich versuche zu suchen (und zählen) und dann in einer Abfrage zurückgeben diese ReportDetail Namen ist, wo

Tag-Namen übereinstimmt bar2 der Tag selbst enthält (oder gleich) grün und item3 gleich foo3

was meinen Sie eigentlich ist:

ich versuche, die Namen jener ReportDetail Elemente zurückzukehren, in dem alle folgenden Bedingungen erfüllt sind:

  • gibt es ein Kind Eigenschaften mit einem Kind-Tag, dessen Name bar2
  • gibt es ein Kind Eigenschaften mit einem Kind-Tag (nicht unbedingt das gleiche), dessen String-Wert ist grün
  • gibt es ein Kind ReportItem mit ein Kind item3 gleich foo3

dann wäre die

//ReportDetail[Properties/tag[@name='bar2'] and Properties/tag[.='green'] and ReportItem/item3[.='foo3]] 

Es scheint mir, dass Ihr eigentliches Problem ist nicht die XPath bei der Codierung, aber logisch auszudrücken und eindeutig, welche Informationen Sie tatsächlich erhalten möchten.