Announcement

Collapse
No announcement yet.

Problem beim Filtern mit ancestor-or-self

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem beim Filtern mit ancestor-or-self

    Hallo alle zusammen,
    ich versuche mich gerade in XPath einzuarbeiten, allerdings bin ich auf eins, zwei Probleme gestoßen. Folgende XML-Datei liegt mir vor:

    Code:
    <haupt>
          <zeile>
            <tag1>
              <raum>029</raum>
              <gruppe>CH1</gruppe>
            </tag1>
            <tag1>
              <raum>204</raum>
              <gruppe>EN1</gruppe>
            </tag1>
            <tag1>
              <raum>139</raum>
              <gruppe>EN2</gruppe>
            </tag1>
            <tag1>
              <raum>213</raum>
              <gruppe>GE1</gruppe>
            </tag1>
          </zeile>
          <zeile>
            <tag1>
              <raum>029</raum>
              <gruppe>CH1</gruppe>
            </tag1>
            <tag1>
              <raum>204</raum>
              <gruppe>EN1</gruppe>
            </tag1>
            <tag1>
              <raum>139</raum>
              <gruppe>EN2</gruppe>
            </tag1>
            <tag1>
              <raum>213</raum>
              <gruppe>GE1</gruppe>
            </tag1>
            <tag1>
              <raum>214</raum>
              <gruppe>GE2</gruppe>
            </tag1>
            <tag2>
              <raum>213</raum>
              <gruppe>MA2</gruppe>
            </tag2>
            <tag2>
              <raum>029</raum>
              <gruppe>CH1</gruppe>
            </tag2>
          </zeile>
    </haupt>
    Mein Ziel ist es diese XML-Datei gezielt nach den gruppen zu filtern, und dann das Array (bspw. für die Gruppe CH1 und EN1) zurückzugeben, sodass am ende nur noch folgendes dasteht (natürlich dann nicht in Form einer XML, sondern in einem Array):

    Code:
    <haupt>
          <zeile>
            <tag1>
              <raum>029</raum>
              <gruppe>CH1</gruppe>
            </tag1>
            <tag1>
              <raum>204</raum>
              <gruppe>EN1</gruppe>
            </tag1>
          </zeile>
          <zeile>
            <tag1>
              <raum>029</raum>
              <gruppe>CH1</gruppe>
            </tag1>
            <tag1>
              <raum>204</raum>
              <gruppe>EN1</gruppe>
            </tag1>
            <tag2>
              <raum>029</raum>
              <gruppe>CH1</gruppe>
            </tag2>
          </zeile>
    </haupt>
    dazu hatte ich versucht folgende xpath-Anweisung zu verwenden:

    Code:
    $gefiltert = $xml->xpath("/haupt/zeile/tag1[gruppe='CH1']");
    so bekomme ich zunächst nur folgendes Array zurückgeliefert:

    Code:
    	[0] => SimpleXMLElement Object
    		(
    			[raum] => 029
    			[gruppe] => CH1
    		)
    
    	[1] => SimpleXMLElement Object
    		(
    			[raum] => 204
    			[gruppe] => EN1
    		)
    
    	[2] => SimpleXMLElement Object
    		(
    			[raum] => 029
    			[gruppe] => CH1
    		)
    
    	[3] => SimpleXMLElement Object
    		(
    			[raum] => 204
    			[gruppe] => EN1
    		)
    soweit sogut, allerdings habe ich ja jetzt nicht mehr den bezug zum tag und der Zeile... eigentlich hatte ich da die ancestor-or-self Funktion gedacht, allerdings erscheinen dann komischerweise wieder alle Einiträge der XML... woran könnte das liegen? Wo ist mein Fehler? und dritte und letzte Frage: kann ich diese Abfrage noch weiter vereinfachen?

    Ich freue mich schon auf eure Antworten.

    Viele Grüße
    L&J

  • #2
    Vereinfachung gefunden - Problem bleibt

    OK - die Vereinfachung habe ich mittlerweile selber gefunden:

    Code:
    //*[gruppe='CH1']
    - diese XPath-Angabe liefert mir nun alle CH1-enthaltenden Gruppen, allerdings brauche ich wie gesagt den kompletten Pfad bis zum Wurzelelement... mit

    Code:
    //*[gruppe='CH1']/ancestor-or-self::*
    bekomme ich aber immernoch das komplette XML-Dokument zurückgeliefert - wo liegt der Fehler?

    Viele Grüße
    L&J

    Comment

    Working...
    X