html_entity_decode在XML dom nodeValue中不起作用

时间:2013-03-11 13:18:19

标签: php xml entity decode entities

我有test.xml文件,我想要对这些节点值进行编码: ...

<section id="1">
<title id="2">&gt;</title>
<title id="2">&lt;</title>
<title id="2">&lt;</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") 
你告诉我它有什么问题吗?

1 个答案:

答案 0 :(得分:1)

首先:

  1. 使用库的整个目的是自动为您完成编码和解码。
  2. 如果您注入文字<字符,则表示您正在定义XML标记。
  3. 假设您有充分理由关注<>的编码方式,则必须使用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了吗?你只能用尖括号做两件事:

    1. 数据
    2. 标签
    3. DOMDocument中,您可以使用createElement()创建代码,并可以插入以前创建的代码,例如appendChild()

      周期。