PHP simplexml实体

时间:2010-05-17 16:07:55

标签: simplexml php entities

这里有什么?

$string = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
    <album>
        <img src="002.jpg" caption="w&aacute;ssup?" />
    </album>
XML;

$xml = simplexml_load_string($string);
// $xmlobj = simplexml_load_file("xml.xml"); // same thing

echo "<pre>";
var_dump($xml);
echo "</pre>";

错误:

  

警告:simplexml_load_string()[function.simplexml-load-string]:实体:第5行:解析器错误:实体'aacute'未定义

5 个答案:

答案 0 :(得分:14)

&aacute不是XML entity - 您正在考虑使用HTML。

特殊字符通常在XML中“按原样”使用 - 输入数据上的html_entity_decode()(不要忘记指定UTF-8作为字符集)应该这样做:

$string = html_entity_decode($string, ENT_QUOTES, "utf-8");

答案 1 :(得分:2)

前几天我遇到了这个问题。 任何出现的&amp;将需要在CDATA标签内

<album>
    <img src="002.jpg" />
    <caption><![CDATA[now you can put whatever characters you need & include html]]></caption>
</album> 

以防止解析器失败。

答案 2 :(得分:2)

您可能希望在替代方法上查看Matt Robinson's article将命名实体转换为PHP中的数字。它提到html_entity_decode方法(已经在另一个答案中指出)和一些潜在的陷阱:

  

这种方法存在两个可能的问题。第一个是无效的实体:html_entity_decode()不会触及它们,这意味着您仍然会遇到XML错误。第二是编码。我想你可能实际上并不想要UTF-8。你应该,因为它很棒,但也许你有充分的理由。如果您没有告诉html_entity_decode()使用UTF-8,它将不会转换您指定的字符集中不存在的实体。如果你告诉它以UTF-8输出然后用iconv()之类的东西来转换它,那么你将丢失任何不在输出编码中的字符。

此外,如果您发现脚本相当繁琐,您也可以使用shared on SourceRally

答案 3 :(得分:1)

另一种解决方案是改变

"w&aacute;ssup?" to "w&amp;aacute;ssup?"

答案 4 :(得分:0)

试试这个功能simplexml_load_entity_string

<?php

$string = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
    <album>
        <img src="002.jpg" caption="test&lt;w&aacute;ssup?" />
    </album>
XML;

$xml = simplexml_load_entity_string($string);

var_dump($xml);

function simplexml_load_entity_string($string = '')
{
    // cover entity except Predefined entities in XML
    $string = str_replace([
        '&quot;', '&amp;', '&apos;', '&lt;', '&gt;',
    ], [
        'SPECIALquotMARK', 'SPECIALampMARK', 'SPECIALaposMARK', 'SPECIALltMARK', 'SPECIALgtMARK',
    ], $string);
    $string = html_entity_decode($string, ENT_QUOTES, "utf-8");
    $string = str_replace([
        'SPECIALquotMARK', 'SPECIALampMARK', 'SPECIALaposMARK', 'SPECIALltMARK', 'SPECIALgtMARK',
    ], [
        '&quot;', '&amp;', '&apos;', '&lt;', '&gt;',
    ], $string);

    // load xml
    return simplexml_load_string($string);
}