3

ここで何が起こっているのですか?

$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'が定義されていません

4

5 に答える 5

14

&aacuteXMLエンティティではありません-あなたはHTMLについて考えています。

特殊文字は通常、XMLでは「そのまま」使用されますhtml_entity_decode()。入力データ(文字セットとしてUTF-8を指定することを忘れないでください)でトリックを実行する必要があります。

$string = html_entity_decode($string, ENT_QUOTES, "utf-8");
于 2010-05-17T16:14:03.867 に答える
2

別の方法に関するMattRobinsonの記事を参照することをお勧めします: PHPで名前付きエンティティを数値に変換するhtml_entity_decodeそれは方法(すでに別の答えによって指摘されている)といくつかの潜在的な落とし穴に言及しています:

このアプローチには2つの問題が考えられます。1つ目は無効なエンティティです。html_entity_decode()それらに触れないため、XMLエラーが発生します。2つ目はエンコーディングです。あなたが実際に欲しくない可能性があると思いますUTF-8。それは素晴らしいので、あなたはすべきですが、おそらくあなたには正当な理由があります。html_entity_decode() を使用するように指示しUTF-8ない場合、指定した文字セットに存在しないエンティティは変換されません。UTF-8で出力するように指示しiconv()、それを変換するようなものを使用すると、出力エンコーディングに含まれていない文字はすべて失われます。

また、スクリプトがかなり面倒な場合は、SourceRallyで共有されているスクリプトを使用することもできます。

于 2010-05-17T16:30:33.353 に答える
2

私は先日この問題を抱えていました。&の出現はすべてCDATAタグ内にある必要があります

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

パーサーが失敗しないようにします。

于 2010-05-17T16:14:50.780 に答える
1

別の解決策は変更することです

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

于 2014-04-12T11:35:48.303 に答える
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);
}
于 2018-02-26T10:18:06.057 に答える