2008-09-26 14 views
5

Piszę wyniki XML z wywołania API przy użyciu PHP i xpath.Ciągnięcie tekstu i atrybutu danego węzła za pomocą 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'); 
} 

Działa to, ale czy jest sposób, w jaki mogę uzyskać dostęp do tekstu i atrybutu z jednego zapytania? A jeśli tak, to w jaki sposób uzyskujesz te elementy po wykonaniu zapytania?

Odpowiedz

4

Po pewnym rozejrzeniu się natrafiłem na to rozwiązanie. W ten sposób mogę uzyskać tekst elementu i uzyskać dostęp do wszystkich atrybutów węzła.

$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

Możesz zapytać o konkatenację?

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

XSLT jest językiem wyrażenie samo w sobie, a można zbudować cokolwiek konkretnego formatu wartości zwracanej chcesz od wewnątrz wyrażenia.

+0

Czy mogę po prostu użyć elementu-> dane i element-> getAttribute, aby pobrać wyniki? –

+0

Nie jestem pewien, jak działa biblioteka XSLT w PHP, ale możesz uzyskać ją tylko za pomocą item-> data. W każdym razie warto spróbować. –

2

Jeśli your're tylko pobierania wartości z dokumentu XML, SimpleXML może być szczuplejsze, szybsze i bardziej przyjazne rozwiązanie pamięci:

$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

Jedno wyrażenie XPath, które wybierze oba węzły tekstowe "a: Książki", a ich atrybutem "DeweyDecimal", jest następujący

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

Zanotuj użycie operatora unii XPath w powyższym wyrażeniu.

Kolejna uwaga: staraj się unikać używania skrótu "//", ponieważ może to spowodować, że cały dokument XML będzie przechodził i dlatego jest bardzo drogi. Zaleca się użycie bardziej specyficznego wyrażenia XPath (takiego jak składający się z łańcucha określonych kroków lokalizacji) zawsze, gdy znana jest struktura dokumentu XML.

Powiązane problemy