2010-08-29 22 views
5

test.html Sonra açıklıklı bulmak için XPath kullanmaya çalışıyorum ve amXpath ile neyi yanlış yapıyorum?

$doc = new DOMDocument(); 
$doc->loadHTMLFile("test.html"); 

$xpath = new DOMXPath($doc); 

$retrieve_data = $xpath->evaluate("//span"); 

echo $retrieve_data->item(1); 
var_dump($retrieve_data->item(1)); 
var_dump($retrieve_data); 

<html> 
    <body> 
     <span> hello Joe</span> 
     <span> hello Bob</span> 
     <span> hello Gundam</span> 
     <span> hello Corn</span> 
    </body> 
</html> 

PHP dosyası bunu yankı ama bunu yankı olamaz gibi görünüyor. Ben düzgün değerlendirdiğini olmadığını görmek için damping çalıştı ve bu çıkış demek ne olduğundan emin değilim: #4 ve #7 demek ve parantez ne demek nedir

object(DOMElement)#4 (0) { } 
object(DOMNodeList)#7 (0) { } 

; Sözdizimi ne anlama geliyor?

Güncelleme: Ben echo $retrieve_data; deneyin ve $retrieve_data->item(1);

Catchable fatal error: Object of class DOMNodeList could not be converted to string 
+0

Değil sorunuzun cevabı, ancak sorgulama XPath daha bana çok daha doğal hissediyor jQuery yolu nesneleri izin PHP DOM kütüphaneleri vardır. * * Nefret ediyorum * XPath. [PHPQuery] (http://code.google.com/p/phpquery/) PHP DOM kullanır - örnekler [here] (http://phpquery-library.blogspot.com/); [SimpleHTMLDOM] (http://simplehtmldom.sourceforge.net/) dize tabanlı fakat aynı zamanda çok güzel. –

+0

PHP'nin XPath sözdizimini bilmiyorum, ama "// span/text()" yi denediniz mi? Şu anda, öğeleri seçiyorsunuz, ancak metni öğelerin içinde çıkarmak istiyorsunuz. –

+1

@chris_l Bu ** PHP'nin ** XPath Sözdizimi değil. Bu sadece XPath. Başka bir dilde aynı, sadece bu PHP sadece XPath 1.0'ı destekliyor. @Doug sorunuzun XPath ile ilgisi yok. Standart 'var_dump' çıktısının nasıl okunacağını soruyorsunuz. – Gordon

cevap

2

yardımcı yankı geçerli:

echo $ retrieve_data-> öğesi (1) -> textContent;

+0

Daha önce echo '$ retrieve_data-> maddesini (1); Bu span html yankılamıyor mu? Ayrıca, textContent bölümünün belgelerini nerede bulabilirim? Bunu yapabileceğini bilmiyordum. – Strawberry

+0

Aynen VdesmedT'in de dediği gibi (1) 'in bir dizgisi yoktur - metin ve ismin yanında çok fazla şey içerebilen Node nesnesidir. Tüm düğümler için temel sınıf (burada tüm mevcut özellikler ile birlikte) açıklanmıştır: http://www.php.net/manual/en/class.domnode.php – Shcheklein

1

Eğer çıkış XML (daha doğrusu HTML) istiyorsanız zaman En fazla bu hatadır, deneyin: BTW

echo $doc->saveXML($retrieve_data->item(1)); 

DOMNodeList, sorgunuzun sonucu, sıfır temel dizinlenmiş, böylece ilk madde 0 olur. Ama belki bunu zaten biliyordun.

1

öğe DOMNode nesnesi olarak, size textContent özelliğini kullanabilirsiniz yayılma içindeki çıkış metni istiyorsanız onun nodeValue özelliği kudreti

+0

Ne dediğin hakkında hiçbir fikrim yok. NodeValue nedir? Öğe (1) gibi? – Strawberry

+0

echo $ retrieve_data-> Öğe (1) -> nodeValue; – VdesmedT

3
$xpath->evaluate("//span"); 

mümkün yazılı bir sonucu ise döner veya bir DOMNodeList verilen XPath ifadesi uyan tüm düğümlerin ihtiva etmektedir. Sizin durumunuzda, bir DOMNodeList döndürür, çünkü XPath, DOMNodes özel olan dört DOMElements değerini değerlendirir. Hangi dilde olursa olsun, herhangi bir XML ile çalışırken Düğüm kavramını anlamak çok önemlidir. DOMNodeList::item daha spesifik sizin durumunuzda bir DOMElement bir DOMNode döndürür çünkü

echo $retrieve_data->item(1); 

, çalışamaz. __toString() yöntemini uygulamıyorlarsa, PHP'de echo nesnesini kullanamazsınız. DOMElement yok. DOMNodeList da yok. Sonuç olarak, nesnenin dize dönüştürülemediği önemli bir hata alırsınız.

DOMElement değerlerini almak için, nodeValue veya textContent öğelerini okuyun. bana göre

Bazı DOM örnekler: https://stackoverflow.com/search?q=user%3A208809+dom

İlgili konular