2008-09-26 8 views
5

Ich analysiere XML-Ergebnisse von einem API-Aufruf mit PHP und XPath.Ziehen Sie den Text und das Attribut eines bestimmten Knotens mit Xpath

$dom = new DOMDocument(); 
$dom->loadXML($response->getBody()); 

$xpath = new DOMXPath($dom); 
$xpath->registerNamespace("a", "http://www.example.com"); 

$hrefs = $xpath->query('//a:Books/text()', $dom); 

for ($i = 0; $i < $hrefs->length; $i++) { 
     $arrBookTitle[$i] = $hrefs->item($i)->data; 
} 

$hrefs = $xpath->query('//a:Books', $dom); 

for ($i = 0; $i < $hrefs->length; $i++) { 
     $arrBookDewey[$i] = $hrefs->item($i)->getAttribute('DeweyDecimal'); 
} 

Das funktioniert aber ist es eine Möglichkeit, sowohl den Text und das Attribut aus einer Abfrage zugreifen kann? Und wenn ja, wie kommen Sie zu diesen Elementen, wenn die Abfrage ausgeführt wurde?

Antwort

4

Nachdem ich mich umgesehen habe, bin ich auf diese Lösung gestoßen. Auf diese Weise kann ich den Elementtext abrufen und auf alle Attribute des Knotens zugreifen.

$hrefs = $xpath->query('//a:Books', $dom); 

for ($i = 0; $i < $hrefs->length; $i++) { 
    $arrBookTitle[$i] = $hrefs->item($i)->nodeValue; 
    $arrBookDewey[$i] = $hrefs->item($i)->getAttribute('DeweyDecimal'); 
} 
0

Können Sie die Verkettung abfragen?

$xpath->query('concat(//a:Books/text(), //a:Books/@DeweyDecimal)', $dom); 

XSLT ist eine Ausdruckssprache in sich selbst, und Sie können unabhängig von spezifischen Format des Rückgabewertes Sie aus dem Ausdruck wollen konstruieren.

+0

Dann würde ich einfach die Artikel-> Daten und Artikel-> GetAttribute verwenden, um die Ergebnisse zu ziehen? –

+0

Ich bin mir nicht sicher, wie die XSLT-Bibliothek von PHP funktioniert, aber Sie können sie möglicherweise nur mit item-> data erhalten. Es ist trotzdem einen Versuch wert. –

2

ob Du nur Werte aus dem XML-Dokument abrufen, SimpleXML könnte die schlanker, schneller und Speicherfreundlichere Lösung:

$xml=simplexml_load_string($response->getBody()); 
$xml->registerXPathNamespace('a', 'http://www.example.com'); 
$books=$xml->xpath('//a:Books'); 
foreach ($books as $i => $book) { 
    $arrBookTitle[$i]=(string)$book; 
    $arrBookDewey[$i]=$book['DeweyDecimal']; 
} 
3

Ein einziger XPath-Ausdruck, der sowohl die Textknoten auswählen, wird von "a: Bücher" und ihre "DeweyDecimal" Attribut ist die folgende

//a:Books/text() | //a:Books/@DeweyDecimal

Beachten Sie die Verwendung des Vereinigungsoperators von XPath in dem obigen Ausdruck.

Eine weitere Anmerkung: Versuchen Sie, die Abkürzung "//" zu vermeiden, da dies dazu führen kann, dass das gesamte XML-Dokument durchlaufen wird und daher sehr teuer ist. Es wird empfohlen, einen spezifischeren XPath-Ausdruck (z. B. bestehend aus einer Kette von bestimmten Positionsschritten) immer dann zu verwenden, wenn die Struktur des XML-Dokuments bekannt ist.

Verwandte Themen