2017-01-05 1 views
1

Die XML-Datei, die ich brauche, um Daten zu erhalten ist groß und hat viele innere Kinder in Kindern. Das XML auf was ich abfragen muss sieht auf dem Bild aus und es hat mehr Ref Kinder in der Firma. xml structurephp xpath mit dom wie schreibe ich kürzere Abfragen

Ich brauche den Firmenknoten, der die richtige Info -> ID hat. Dieser Knoten hat 3 Ref-Knoten und ich muss Date von demjenigen erhalten, der das richtige Who hat.

Ich habe dies mit diesem hässlichen Code arbeiten:

$query_pod = "//Seller/Company/Info/ID[ID = 'IV'] | //Seller/Company/Ref/Who[Who = 'VA'] | //Seller/Company/Ref/Date"; 
foreach ($xpath->query($query_pod) as $pod) 
{ 
    $pod_dates = $xpath->query("//Seller/Company/Ref/Who[Who = 'VA'] | //Seller/Company/Ref/Date", $pod); 
    $pod_date = $pod_dates->item(0)->nodeValue; 
} 

ich es kürzer tryed aber ich kann das Auswahlelement in [] wie diese:

$query_pod = "//Seller/Company/Info[ID = 'IV']"; 
foreach ($xpath->query($query_pod) as $pod) 
{ 
    $pod_dates = $xpath->query("//Seller/Company/Ref/Date[Who = 'VA'], $pod); 
    $pod_date = $pod_dates->item(0)->nodeValue; 
} 

Kann jemand helfen? Ich bin neu in XPath.

+0

$ pod_dates = $ xpath-> query („// Verkäufer/Unternehmen/Ref/Date [Who = 'VA'] ", $ pod); Es gibt keine Fehler oder Schreibfehler in meinem echten Code. –

Antwort

0

Ihr zweiter Ausdruck (das Ein in der Schleife) hängt nicht vom Kontext ab. Ein Schrägstrich (/) am Anfang eines Standortpfads bedeutet, dass absolut ist, es beginnt am Dokumentknoten. [] sind Bedingungen, die das Ergebnis aus dem vorherigen Standortpfad filtern. Sie sind selbst voller Xpath-Ausdruck. Nein, es ist nicht immer möglich, die Xpath-Ausdrücke zu verkürzen. Aber in Ihrem Fall können Sie den Firmenknoten als Liste holen und dann die Details direkt mit DOMXpath::evaluate(). Im Gegensatz zu DOMXpath::query() kann DOMXpath::evaluate() Knotenlisten oder Skalarwerte zurückgeben. Es hängt von dem Ausdruck ab.

$xml = <<<'XML' 
<Seller> 
    <Company> 
    <Info> 
     <ID>123</ID> 
     <Address>Some street, somewhere</Address> 
    </Info> 
    <Ref> 
     <Who>456</Who> 
     <Date>2017-01-05T01:59Z</Date> 
    </Ref> 
    </Company> 
</Seller> 
XML; 

$document = new DOMDocument(); 
$document->loadXml($xml); 
$xpath = new DOMXpath($document); 

foreach ($xpath->evaluate('/Seller/Company[Info/ID = "123"]') as $company) { 
    var_dump(
    $xpath->evaluate('string(Info/ID)', $company), 
    $xpath->evaluate('string(Ref/Date)', $company) 
); 
} 

Ausgang:

string(3) "123" 
string(17) "2017-01-05T01:59Z" 

Wenn Sie nur einen einzigen Wert benötigen, können Sie es direkt holen:

var_dump(
    $xpath->evaluate('string(/Seller/Company[Info/ID = "123"]/Ref/Date)') 
); 
+0

Hatte eine Menge Arbeit so getestet und es funktioniert nicht. Es stellt meine Frage nicht einmal in den Schatten. Mein XML hat mehr als 1 Ref und das korrekte Datum ist in demjenigen mit wer "456". Es sollte also so etwas wie ("Ref [Who = '456']/Date") sein. Aber mein Problem ist, dass es nicht einmal in die foreach-Schleife kommt. –

+0

ok es funktioniert mit dem "Ref [Who = '456']/Date". Vielen Dank! –