一重引用符を使用して XML を解析しますか?
-
02-07-2019 - |
質問
現在、要素が単一引用符を含む XML ファイルから返されるという問題に遭遇しています。これにより、xml_parse がそれを複数のチャンクに分割します。例:配線してください、あなたは雇われています!次に、「Get Wired、あなたは1つのオブジェクトであり、単一の引用が2番目であり、「Re Hired!」として解釈されます。 3分の1として。
私がやりたいことは次のとおりです。
while($data = fread($fp, 4096)){
if(!xml_parse($xml_parser, htmlentities($data,ENT_QUOTES), feof($fp))) {
break;
}
}
しかし、それは壊れ続けます。htmlentities の代わりに str_replace を実行すると問題なく実行されますが、htmlentities では実行したくありません。
何か案は?
アップデート:以下の JimmyJ の応答に従って、次の解決策を試みましたがうまくいきませんでした (参考までに、リンクされた投稿の上に、直接リンクされているコードを更新する応答が 1 つまたは 2 つあります)。
function XMLEntities($string)
{
$string = preg_replace('/[^\x09\x0A\x0D\x20-\x7F]/e', '_privateXMLEntities("$0")', $string);
return $string;
}
function _privateXMLEntities($num)
{
$chars = array(
39 => ''',
128 => '€',
130 => '‚',
131 => 'ƒ',
132 => '„',
133 => '…',
134 => '†',
135 => '‡',
136 => 'ˆ',
137 => '‰',
138 => 'Š',
139 => '‹',
140 => 'Œ',
142 => 'Ž',
145 => '‘',
146 => '’',
147 => '“',
148 => '”',
149 => '•',
150 => '–',
151 => '—',
152 => '˜',
153 => '™',
154 => 'š',
155 => '›',
156 => 'œ',
158 => 'ž',
159 => 'Ÿ');
$num = ord($num);
return (($num > 127 && $num < 160) ? $chars[$num] : "&#".$num.";" );
}
if(!xml_parse($xml_parser, XMLEntities($data), feof($fp))) {
break;
}
アップデート: 以下のトムの質問によると、魔法の引用符は実際にオフになっています/オフになっていました。
解決: 問題を解決するために私が最終的にやったことは次のとおりです。
個々の項目/投稿などのデータを収集した後、そのデータを後で出力に使用する配列に保存し、収集中に使用されたローカル変数をクリアします。データがすでに存在するかどうかを確認し、存在する場合は上書きするのではなく最後に連結するステップを追加しました。
したがって、最終的に 3 つのチャンクができた場合 (上記のように、「Get Wired, You're Hired!」に固執しましょう)、その後は次の作業を終了します。
$x = 'Get Wired, You'
$x = "'"
$x = 're Hired!'
行うこと:
$x = 'Get Wired, You' . "'" . 're Hired!'
これは最適な解決策ではありませんが、うまく機能しているようです。
解決
ファイルを簡単に解析するには、simplexml_load_file のようなものを使用してみてはいかがでしょうか。
他のヒント
マジック クォーテーションを有効にすると、XML 解析が混乱することがあると思いますが、これは有効になっていますか?これを実行時に無効にすることができます。
set_magic_quotes_runtime(0);
編集:ソースが post または get でない場合、これは関係ないかもしれませんが、いずれにしても奇妙な動作を引き起こす可能性があると PHP マニュアルで読みました。