我的PHP应用程序正在输出XML文件,某些输出可能包含商标和/或版权字符。有没有办法在输出中转义这些字符?
谢谢!
答案 0 :(得分:5)
您需要在XML中转义的唯一特殊字符是:
< - <
> - >
& - &
" - "
' - ' / '
您可以在属性值或文本节点中使用转义变体。以下2个示例表示相同的内容。
<foo><Hello@World></foo>
<foo><![CDATA[<Hello@World>]]></foo>
<foo/>
的nodeValue始终为<Hello@World>
。
第一个是文本节点,第二个是cdata部分。在cdata部分中,不允许实体,禁止序列]]>
。如果CDATA部分包含]]>
,则DOM将自动拆分。
如果您没有为XML使用支持Unicode的编码,则只需转义其他特殊字符(如©)。如果需要简单的ASCII XML,可以将特殊字符编写为数字字符引用。该数字是Unicode中字符的代码点。
© - © / ©
模式和DTD可以定义命名的字符实体引用。这些在XML中不可用,但可以基于XML的格式提供。 (X)HTML就是一个例子。
© - ©
如果您使用DOM,它会根据需要进行处理。
在UTF-8中,只会转义XML特殊字符。
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->appendChild($dom->createElement('foo'));
$dom->documentElement->appendChild($dom->createTextNode('<©€äöü>'));
echo $dom->saveXml();
输出:
<?xml version="1.0" encoding="UTF-8"?>
<foo><©€äöü></foo>
在ASCII中,还会有更多内容被转义:
$dom = new DOMDocument('1.0', 'ASCII');
$dom->appendChild($dom->createElement('foo'));
$dom->documentElement->appendChild($dom->createTextNode('<©€äöü>'));
echo $dom->saveXml();
输出:
<?xml version="1.0" encoding="ASCII"?>
<foo><©€äöü></foo>