2011-05-15 143 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