在 PHP 中生成 XML 文档(转义字符)

2022-08-30 11:18:32

我正在从PHP脚本生成一个XML文档,我需要转义XML特殊字符。我知道应该转义的字符列表;但是正确的方法是什么?

字符应该只用反斜杠(\')转义,还是正确的方式是什么?有没有内置的PHP函数可以为我处理这个问题?


答案 1

我创建了一个简单的函数,该函数使用 XML 中的五个“预定义实体”进行转义:

function xml_entities($string) {
    return strtr(
        $string, 
        array(
            "<" => "&lt;",
            ">" => "&gt;",
            '"' => "&quot;",
            "'" => "&apos;",
            "&" => "&amp;",
        )
    );
}

使用示例演示

$text = "Test &amp; <b> and encode </b> :)";
echo xml_entities($text);

输出:

Test &amp;amp; &lt;b&gt; and encode &lt;/b&gt; :)

通过使用可以达到类似的效果,但由于双重替换(未经测试,不推荐),它很脆弱:str_replace

function xml_entities($string) {
    return str_replace(
        array("&",     "<",    ">",    '"',      "'"),
        array("&amp;", "&lt;", "&gt;", "&quot;", "&apos;"), 
        $string
    );
}

答案 2

使用 DOM 类生成整个 XML 文档。它将处理我们甚至不想关心的编码和解码。


编辑:这受到@Tchalvak的批评:

DOM 对象创建一个完整的 XML 文档,它不容易自己对字符串进行编码。

这是错误的,DOMDocument可以正确地输出一个片段,而不是整个文档:

$doc->saveXML($fragment);

它给出:

Test &amp; <b> and encode </b> :)
Test &amp;amp; &lt;b&gt; and encode &lt;/b&gt; :)

如:

$doc = new DOMDocument();
$fragment = $doc->createDocumentFragment();

// adding XML verbatim:
$xml = "Test &amp; <b> and encode </b> :)\n";
$fragment->appendXML($xml);

// adding text:
$text = $xml;
$fragment->appendChild($doc->createTextNode($text));

// output the result
echo $doc->saveXML($fragment);

观看演示


推荐