Bitte um Hilfe beim XML auslesen über Xpath


Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

BIM-T

Mitglied
Hallo ihr alle,

ich habe ein Problem und komme irgendwie nicht wirklich weiter.
Ich möchte aus der folgenden XML-Datei in einem bestimmten Node Attribute mit XPath auslesen und sie für die Übergabe an eine DB auflisten lassen.
Ich komme zwar an das übergeordnete Element, jedoch nicht an die darunter angesiedelten Attributwerte.

Hier mal die XML, mein Xpath Ansatz und die entsprechende Stelle in der XML, bei der ich die "ref=" der IfcPropertySingleValue auslesen muss.
Ich hoffe ihr könnt mir irgendeinen Tipp geben. Ich habe schon herausgefunden, dass ich zur Navigation ifc: verwenden muss, kann es sein das dieser Node noch anders behandelt werden muss???

Hier die entsprechende stelle:

XML:
<IfcPropertySet id="i1865">
            <GlobalId>3lRJNnzSXDfv7i5MWTya4J</GlobalId>
            <OwnerHistory>
                <IfcOwnerHistory xsi:nil="true" ref="i1677"/>
            </OwnerHistory>
            <Name>Pset_WallCommon</Name>
            <HasProperties exp:cType="set">
                <IfcPropertySingleValue xsi:nil="true" ref="i1859"/>
                <IfcPropertySingleValue xsi:nil="true" ref="i1860"/>
                <IfcPropertySingleValue xsi:nil="true" ref="i1861"/>
                <IfcPropertySingleValue xsi:nil="true" ref="i1862"/>
                <IfcPropertySingleValue xsi:nil="true" ref="i1863"/>
                <IfcPropertySingleValue xsi:nil="true" ref="i1864"/>
            </HasProperties>
        </IfcPropertySet>
und hier mein Pfad:
Code:
$path_has_Values_WC = $xpath->query('//ifc:IfcPropertySet[@id="i1865"]/HasProperties/@ref');

foreach ($path_has_Values_WC as $WC_Attr_refs){
   $name = $WC_Attr_ref->nodeName;
  $value = $WC_Attr_refs->nodeValue;
   echo "Attribute '$name' : '$value'<br />";


}
Vielen Dank schon einmal
 

Anhänge

ComFreek

Mod | @comfreek
Moderator
$xpath->query('//ifc:IfcPropertySet[@id="i1865"]/HasProperties/@ref');
Das Problem hier ist, dass @ref kein Attribut von deinen <HasPropreties>-Tags ist, sondern von <IfcPropertySingleValue>.

Beim nächsten Mal bitte gleich ein PHP Fiddle erstellen, wo man direkt etwas testen kann. Ich habe jetzt eins für dich erstellt: Ideone.com

Mit diesem Code - kopiert aus dem Fiddle - funktioniert es nun:
PHP:
$doc = new DOMDocument;
$doc->loadxml($xmlStr);
$xpath = new DOMXPath($doc);
$refValues = array_map(
  function ($attr) { return $attr->nodeValue; },
  iterator_to_array($xpath->query('//ifc:IfcPropertySet[@id="i1865"]/ifc:HasProperties/ifc:IfcPropertySingleValue/@ref'))
);
var_dump($refValues);
array(6) { [0]=> string(5) "i1859" [1]=> string(5) "i1860" [2]=> string(5) "i1861" [3]=> string(5) "i1862" [4]=> string(5) "i1863" [5]=> string(5) "i1864" }
Übrigens wundere ich mich, wo überhaupt der Namespacealias "ifc" definiert wird :unsure: Es funktioniert jedenfalls!
 

BIM-T

Mitglied
Das Problem hier ist, dass @ref kein Attribut von deinen <HasPropreties>-Tags ist, sondern von <IfcPropertySingleValue>.

Beim nächsten Mal bitte gleich ein PHP Fiddle erstellen, wo man direkt etwas testen kann. Ich habe jetzt eins für dich erstellt: Ideone.com

Mit diesem Code - kopiert aus dem Fiddle - funktioniert es nun:
PHP:
$doc = new DOMDocument;
$doc->loadxml($xmlStr);
$xpath = new DOMXPath($doc);
$refValues = array_map(
  function ($attr) { return $attr->nodeValue; },
  iterator_to_array($xpath->query('//ifc:IfcPropertySet[@id="i1865"]/ifc:HasProperties/ifc:IfcPropertySingleValue/@ref'))
);
var_dump($refValues);


Übrigens wundere ich mich, wo überhaupt der Namespacealias "ifc" definiert wird :unsure: Es funktioniert jedenfalls!
Vielen Dank für die schnelle Hilfe! :) Mit den Informationen kann ich jetzt weiter arbeiten! Ich wünsche dir einen guten Rutsch ins neue Jahr.
viele Grüße
 

BIM-T

Mitglied
Das Problem hier ist, dass @ref kein Attribut von deinen <HasPropreties>-Tags ist, sondern von <IfcPropertySingleValue>.

Beim nächsten Mal bitte gleich ein PHP Fiddle erstellen, wo man direkt etwas testen kann. Ich habe jetzt eins für dich erstellt: Ideone.com

Mit diesem Code - kopiert aus dem Fiddle - funktioniert es nun:
PHP:
$doc = new DOMDocument;
$doc->loadxml($xmlStr);
$xpath = new DOMXPath($doc);
$refValues = array_map(
  function ($attr) { return $attr->nodeValue; },
  iterator_to_array($xpath->query('//ifc:IfcPropertySet[@id="i1865"]/ifc:HasProperties/ifc:IfcPropertySingleValue/@ref'))
);
var_dump($refValues);


Übrigens wundere ich mich, wo überhaupt der Namespacealias "ifc" definiert wird :unsure: Es funktioniert jedenfalls!

Jetzt hat mit dem auslesen alle geklappt, als nächstes stehe ich vor der Aufgabe, dass ich eine "ref-id" erhalte von dieser aus auf die id des Parent-Nodes zurückspringen will und mir denn id ausgeben lassen will. Hat jemand eine Idee wie ich das umsetzen könnte? Alles was ich bis jetzt versucht habe hat nicht gebracht.

Vielen Dank schon einmal!
 

BIM-T

Mitglied
Und was hast du probiert bzw. gegoogelt? Ich bin mir sehr sicher, dass du das via Google finden wirst.
Ich habe folgende Sachen versucht:
1)
Hier mein aktueller Pfad im DOM
PHP-Code:
PHP:
$get_all_Pset_IDs = $xpath->query("//parent::ifc:IfcPropertySet/ifc:OwnerHistory/ifc:IfcOwnerHistory[@ref='i1677']/@id");
Leider Funktioniert es weder mit ancestor:: noch mit ../ wie es in anderen Foren steht. oder ich mache etwas falsch.
 
Zuletzt bearbeitet:

ComFreek

Mod | @comfreek
Moderator
$get_all_Pset_IDs = $xpath->query("//parent::ifc:IfcPropertySet/ifc:OwnerHistory/ifc:IfcOwnerHistory[@ref='i1677']/@id");
Das parent macht an dieser Stelle wenig Sinn. Du musst zuerst das gewünschte Kind selektieren, dann mittels /parent::ifc:IfcPropertySet hochnavigieren. Das navigiert aber nur zum direkten Parent, falls diesre auch ein IfcPropretySet ist. Falls nicht, matcht das Query nicht auf dem Kind Tag und es wird weiter probiert.

Leider Funktioniert es weder mit ancestor:: noch mit ../ wie es in anderen Foren steht. oder ich mache etwas falsch.
Ich habe bereits in meinem letztem Beitrag dich darum gebeten zu posten, was genau du versucht hast.

Probier Folgendes:
PHP:
$xpath = new DOMXPath($doc);
foreach ($xpath->query('//*[@ref="i1677"]/ancestor::*[@id][1]') as $node) {
 echo $node->tagName . " with id='" . $node->getAttribute('id') . "'\n";
}
Live auf Ideone: Ideone.com

Meine Google-Suchen waren wie folgt:
Wenn du genau hinschaust, habe ich mein XPath Query auch genau so zusammengebaut.

Verstehst du dieses XPath Query? Kannst du es mit eigenen Worten wiedergeben? ;)
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Neue Beiträge