2011-05-15 18 views
5

Bir HTML belgesindeki öğeleri bulmak için PHP'de DOMDocument ve DOMXPath kullanıyorum. Bu belge, & nbsp; ve bu varlıkların XPath çıktısında korunmasını istiyorum.DOMXPath'in HTML varlıklarını genişletmesi nasıl engellenir?

$doc = new DOMDocument(); 
$doc->loadHTML('<html><head></head><body>&nbsp;Test</body></html>'); 

$xpath = new DOMXPath($doc); 
$nodes = $xpath->query('//body'); 

foreach($nodes as $node) { 
    echo $node->textContent; 
} 

Bu kod aşağıdaki çıktıyı üretir (UTF-8):

[space]Test 

Ama istiyorum bu olması:

&nbsp;Test 

Belki LibXML bir ilgisi vardır PHP dahili olarak kullanır, ancak HTML öğelerini koruyan herhangi bir işlev bulamadım.

Bir fikrin var mı? olmayan bir fren boşluk karakteri &nbsp; veya &#xA0;' -- the character is always provided to it as a character entity -- & # 160` olarak belirtildi

+2

'[boşluk]' UTF-8 değil. U + 0020 ve U + 00A0 olmadığından emin misiniz? – Alohci

+0

@Alohci: Evet, haklısın, U + 00A0. Ben sadece net yapmak istedim, çıktı nbsp varlık yerine beyaz boşluk ile görüntülenir. – chrisklaussner

+0

@Dimitre: Üzgünüm, ama bu bir XPath özel sorudur. Bir XPath sorgusunun çıktısı ile ilgili. – chrisklaussner

cevap

4

XPath hep öğe başvuruları genişletilmiştir ettiği XML belgesine bir temsilini görür. Bunu önlemenin tek yolu, XML belgesinin ön işleminin yapılması, varlık referanslarının genişletilmeyecek bir şeyle değiştirilmesi, örneğin &nbsp;'un §nbsp;'a değiştirilmesidir.

2

Bir XPath işlemci farkında değildir.

+0

Bu cevabın doğru olduğunu düşünmüyorum. Bir XPath işlemcisi Infoset üzerinde çalışmaz, Infoset cinsinden tanımlanan XPath veri modelinde (XDM) çalışır. Infoset, Unexpanded Varlık Referans Bilgi Öğelerinin varlığına izin verir. XDM yok. Yani gerçekten bir XPath meselesi. –

+0

@Michael Kay: Bu düzeltme için teşekkür ederiz. –

İlgili konular