XPath kullanarak belirli bir düğümün metin ve niteliğini hem Çekme

4 Cevap php

Ben PHP ve XPath kullanarak bir API çağrısı XML sonuçlarını ayrıştırma.

 $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');
 }

Bu çalışır ama bir sorgudan metin ve niteliğini hem de erişebilirsiniz bir yolu var mı? Ve eğer öyleyse sorgu yürütüldüğünde sonra nasıl bu öğeler alabilirim?

4 Cevap

Etrafa biraz yaptıktan sonra ben bu çözüm geldi. Bu şekilde ben eleman metni almak ve düğüm herhangi özelliklerini erişebilirsiniz.

$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');
}

Yorum yok sadece XML belgesinden değerleri alınıyor ise, SimpleXML yalın, hızlı ve hafıza-dostça bir çözüm olabilir:

$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'];
}

Metin düğümleri hem seçecek tek bir XPath ifadesi "a: Kitaplar" ve "DeweyDecimal" niteliğini aşağıdadır

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

Do note Yukarıdaki ifadede XPath adlı sendika operatörü kullanımı.

Another note: o tüm XML belge geçilen neden ve bu nedenle çok pahalı olabilir "/ /" kısaltmasını kullanarak kaçınıyorum. Bu XML belgesinin yapısı bilinmektedir her zaman (örneğin belirli bir konuma adımlar zincirinden oluşan gibi) daha özel bir XPath ifadesi kullanılması tavsiye edilir.

Eğer birleştirme için sorgulamak misiniz?

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

XSLT başlı başına bir anlatım dili olduğunu ve ifade içinden istediğiniz dönüş değeri belirli hangi formatta olursa olsun inşa edebilirsiniz.