- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想使用 PHP 使用 DOM 对 XML 文档执行某些操作它的标准库的一部分。正如其他人已经discovered ,然后必须处理解码的实体。为了说明困扰我的问题,我举了一个简单的例子。
假设我们有如下代码
$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在我设置 $node->nodeValue
之前在 $text
上。现在我想知道
我必须处理的 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>
(并且是,如果循环被省略)并根据警告
Warning: main(): unterminated entity reference ns_source=PublicRSS20-sa in /private/tmp/beeb.php on line 15
当我将 htmlspecialchars
应用于 $node->textContent
时,它工作正常,但我觉得这样做很不舒服。
最佳答案
您的问题基本上是是否设置 DOMText::nodeValue
到 XML 编码字符串或逐字字符串。
所以让我们尝试一下,将其设置为 &
和 '&
看看会发生什么:
$doc = new DOMDocument();
$doc->loadXML('<root>*</root>');
$text = $doc->documentElement->childNodes->item(0);
echo "Before Edit: ", $doc->saveXML($text), "\n";
$text->nodeValue = "&";
echo "After Edit 1: ", $doc->saveXML($text), "\n";
$text->nodeValue = "&";
echo "After Edit 2: ", $doc->saveXML($text), "\n";
然后输出如下(PHP 5.0.0 - 5.5.0):
Before Edit: *
After Edit 1: &
After Edit 2: &amp;
这表明设置 DOMText
节点的 nodeValue
需要 UTF-8 编码字符串,DOM 库会自动对 XML 保留字符进行编码。
因此,您不应将 htmlspecialchars()
应用到以这种方式添加的任何文本上。这会产生双重编码。
当您编写时,您会遇到相反的情况,我建议您在命令行上/在您的 IDE 中执行一个独立的 PHP 示例,以便您可以准确地看到输出。并不是说您的浏览器将其呈现为 HTML,然后您认为保留的 XML 字符未被编码。
正如您所指出的,您不是在编辑 DOMText
,而是在编辑 DOMElement
节点。它的工作方式有点不同,这里 &
字符需要作为实体 &
而不是逐字传递,但是只有这个字符。
所以这需要更多的工作:
DOMText
节点。一切都将被完美编码。DOMText
节点表单附加为子节点。完成了。这里你的内部 foreach 修改显示:
foreach($node_list as $node) {
$text = $doc->createTextNode($node->textContent);
$node->nodeValue = "";
$node->appendChild($text);
}
对于你的具体例子,尽管我必须承认我不明白你为什么这样做,因为这不会改变值(value),所以它不需要这个。
Tip: In PHP DOMDocument can open this feed directly, you don't need curl here:
$doc = new DOMDocument();
$doc->load("http://feeds.bbci.co.uk/news/rss.xml?edition=uk");
关于php - PHP 中的 DOM : Decoded entities and setting nodeValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17321770/
// html Hello World! // Javascript var textNode = div.firstChild; textNode.nodeValue = "Hello Us"; 样
这是我所拥有的: 我即时创建此标记: 现在我需要填充跨度: if (amount.firstChild.nodeType == 1) { amount.firstChild.nodeValue
我正在尝试编写一个脚本来验证 nodeValue 是否在 html 文档中 var myVar= document.getElementsByTagName("b"); for (var i = 0;
我正在使用 jquery 解析 XML 文档,并且属性的 nodeValue 似乎存在一些问题。我有以下元素: ...其中属性 formattednumber 是最终将在 UI 中显示的字符串。这很
x=document.getElementByTagName("p"); document.write(x.lastChi
当获取在 nodeValue 中有实体的 DOMNode 对象的 nodeValue(即 a & gt;)时,它将实体转换为它的可打印字符(即 >) 有没有人知道一种方法可以让它保持作为一个实体,当它
我一直在努力寻找一个功能完全相同的 jQuery 替代品: document.getElementById("element").firstChild.nodeValue = value; 以下是相关
假设我有一个节点列表 NodeList(5) [div.card, div.card, div.card, div.card, div.card] 0 : div.card 1 :
我是 Ajax 新手。 我正在尝试解析 this document . 我已经了解了 readystatechange,它正在获取 XML。但是当涉及到子节点及其值时,我感到困惑。 这是一些代码。如果
我应该使用哪一个? http://reference.sitepoint.com/javascript/CharacterData/data http://reference.sitepoint.co
假设我有一个非常基本的页面,其中包含正文、单个 div 和一个包含一些文本的段落元素。 some text 根据浏览器的不同,body/div 元素将具有文本节点(nodeTy
我有一个表格单元格,其值包含换行符,如下所示。 Foo Bar 我正在使用 td.childNodes[0].nodeValue 读取单元格内容并在 Ajax 请求中传递该值。但 IE8 将 LF 读
好吧,我有一个HTML网页,上面没有什么特别的东西,对吧?问题是,当我尝试不使用CSS(使用传统的标记)将图像放到屏幕上时,在FireFox中会出现以下错误: 不赞成使用属性的nodeValue属性。
我在设置变量时遇到问题,并且找不到任何有用的文档。 这有效: Foobar 但这不起作用: var theText = document.getElementBy
假设我有这段代码: Hello this is a description. Click here for more. 如何选择 p 的节点值但排除 a 及其内容? 我当前的代码: $result
标题应该很好地描述了我的问题。这是我的代码。 Some text function vb(){ alert(document.getElementById("adiv").firstChild
当使用 DOMDocument 解析 html 文档时,我从 nodeValue 获得了不同的编码。在我的开发环境中,我得到的是 UTF-8,但是当将脚本上传到网络服务器时,我得到的是 ISO-885
我正在尝试从 开始具有文本的元素 成交时的值(value) 然后得到它的父 并获得以下 sibling ,即 从那获取 child 的文字 . 据我所知,代码是正确的,应该回显 $1,034.29。
我在跳过空节点值时遇到问题。下面我通过从 XML 文件读取不同的标签来创建一个对象。问题是,当尝试读取“Addresse5”的 nodeValue 时,我收到一条错误,指出节点值未定义。 va
我正在尝试从 td 中提取文本,如此处所述 Replacing a part of text inside a td $('.my-table tr').each(function() {
我是一名优秀的程序员,十分优秀!