我想使用 PHP 标准库的DOM部分对 XML 文档执行某些操作。正如其他人已经发现的那样,然后必须处理解码的实体。为了说明困扰我的问题,我举一个简单的例子。
假设我们有以下代码
$doc = new DOMDocument();
$doc->loadXML(<XML data>);
$xpath = new DOMXPath($doc);
$node_list = $xpath->query(<some XPath>);
foreach($node_list as $node) {
//do something
}
如果循环中的代码类似于
$attr = "<some string>";
$val = $node->getAttribute($attr);
//do something with $val
$node->setAttribute($attr, $val);
它工作正常。但如果它更像
$text = $node->textContent;
//do something with $text
$node->nodeValue = $text;
并$text
包含一些解码的&,它不会被编码,即使一个人什么都不做$text
。
目前,我在设置之前应用了htmlspecialchars。现在我想知道$text
$node->nodeValue
- 如果这足够了,
- 如果没有,什么就足够了,
- 如果有更优雅的解决方案,例如属性操作。
我必须处理的 XML 文档主要是提要,因此解决方案应该非常通用。
编辑
原来我原来的问题的范围有误,很抱歉。在这里,我提供了一个实际发生所描述行为的示例。
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://feeds.bbci.co.uk/news/rss.xml?edition=uk");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
$doc = new DOMDocument();
$doc->loadXML($output);
$xpath = new DOMXPath($doc);
$node_list = $xpath->query('//item/link');
foreach($node_list as $node) {
$node->nodeValue = $node->textContent;
}
echo $doc->saveXML();
如果我在 CLI 上执行此代码
php beeb.php |egrep 'link|Warning'
我得到类似的结果
<link> http://www.bbc.co.uk/news/world-africa-23070006#sa-ns_mchannel=rss</link >
应该是
<link> http://www.bbc.co.uk/news/world-africa-23070006#sa-ns_mchannel=rss&ns_source=PublicRSS20-sa</link >
(并且是,如果省略循环)并根据警告
警告:main():第 15 行 /private/tmp/beeb.php 中的未终止实体引用 ns_source=PublicRSS20-sa
当我申请htmlspecialchars
时$node->textContent
,它工作得很好,但我觉得这样做很不舒服。