我有test.xml文件,我想要对这些节点值进行编码: ...
<section id="1">
<title id="2">></title>
<title id="2"><</title>
<title id="2"><</title>
</section>
...
所以我编写了这段代码但是在保存XML之后是相同的,没有一个节点值被解码为“&lt;”来自“$ lt;”
php代码:
$dom = new DOMDocument;
$dom->load("test.xml");
$titles = $dom->getElementsByTagName('title');
foreach ($titles as $title) {
$title->nodeValue=html_entity_decode($title->nodeValue);
}
$dom->save("success.xml")
你告诉我它有什么问题吗?
答案 0 :(得分:1)
首先:
<
字符,则表示您正在定义XML标记。假设您有充分理由关注<
和>
的编码方式,则必须使用CDATA:
<?php
$dom = new DOMDocument;
$dom->load("test.xml");
$titles = $dom->getElementsByTagName('title');
foreach ($titles as $title) {
$newNode = $dom->createCDATASection($title->nodeValue);
$title->nodeValue = null;
$title->appendChild($newNode);
}
$dom->save("success.xml");
...生成:
<?xml version="1.0"?>
<section id="1">
<title id="2"><![CDATA[>]]></title>
<title id="2"><![CDATA[<]]></title>
<title id="2"><![CDATA[<]]></title>
</section>
但是这个文件100%等同于你已经拥有的文件(缺少<?xml version="1.0"?>
标题除外)。
编辑#1:实体只是编码特殊字符的语法技巧,它们根本不会改变节点内容,PHP会自动解码所有内容:
$dom = new DOMDocument;
$dom->load("test.xml");
$titles = $dom->getElementsByTagName('title');
foreach ($titles as $title) {
var_dump($title->nodeValue);
}
...按预期打印解码内容:
string(1) ">"
string(1) "<"
string(1) "<"
或许用另一个例子更容易看到:
echo 'O\'Brian';
...打印O'Brian
和不 O\'Brian
。我们正在编码字符串,而不是修改它。
我怀疑在整个图片中有一些像这样的jQuery代码:
$.get('ajax/data.php', function(data) {
$('.result').text(data);
});
......应该有类似的东西:
$.get('ajax/data.php', function(data) {
$('.result').html(data);
});
编辑#2:
我甚至无法想象你的创作系统是如何工作的(我希望你没有使用WYSIWYG编辑器来实际输入 HTML标签)但是你已经问过XML和XML了吗?你只能用尖括号做两件事:
在DOMDocument中,您可以使用createElement()创建代码,并可以插入以前创建的代码,例如appendChild()
周期。