2011-05-15 62 views
5

我在PHP中使用DOMDocument和DOMXPath來查找HTML文檔中的元素。 本文檔包含HTML實體,如& nbsp;我希望將這些實體保存在XPath輸出中。如何防止DOMXPath擴展HTML實體?

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

此代碼產生以下輸出(UTF-8):

[space]Test 

不過,我想有這樣的:

&nbsp;Test 

或許這事做的libxml是PHP在內部使用,但我找不到任何保留HTML實體的函數。

你有什麼想法嗎?

+2

''[space]'不是UTF-8。你確定它是U + 0020而不是U + 00A0嗎? – Alohci 2011-05-15 11:39:23

+0

@Alohci:是的,你說得對,它是U + 00A0。我只是想弄清楚,輸出是用空白而不是nbsp實體顯示的。 – chrisklaussner 2011-05-15 20:42:31

+0

@Dimitre:對不起,但這是一個XPath特定的問題。這是關於XPath查詢的輸出。 – chrisklaussner 2011-05-15 20:47:33

回答

4

XPath總是看到擴展了實體引用的XML文檔的表示。防止這種情況的唯一方法是預處理XML文檔,將實體引用替換爲不會展開的內容,例如將&nbsp;更改爲§nbsp;

2

XPath處理器不知道非制動空間字符是否被指定爲&nbsp;&#xA0;' -- the character is always provided to it as a character entity --&#160`。

+0

我不認爲這個答案是正確的。 XPath處理器不在Infoset上運行,它在根據Infoset定義的XPath數據模型(XDM)上運行。 Infoset允許存在未擴展的實體參考信息項目。 XDM沒有。所以這確實是一個XPath問題。 – 2011-05-15 22:17:49

+0

@邁克爾凱:感謝您的糾正。 – 2011-05-15 23:27:37