-2

我有 test.xml 文件,我希望在其中对这些节点值进行编码:...

<section id="1">
<title id="2">&gt;</title>
<title id="2">&lt;</title>
<title id="2">&lt;</title>
</section>

...

所以我写了这段代码,但是在它保存 XML 之后,没有一个节点值从“$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") 

你能告诉我它有什么问题吗?

4

1 回答 1

1

首先:

  1. 使用库的全部目的是自动为您完成编码和解码。
  2. 如果您注入一个文字<字符,那么您就是在定义一个 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 中,您只能从角度做两件事括号:

  1. 数据
  2. 标签

DOMDocument中,您可以使用createElement()创建标签,并且可以使用例如appendChild()插入先前创建的标签。

时期。

于 2013-03-11T13:29:01.970 回答