<!-- MEMCACHE empty -->
上記は、リモートでアクセスしようとしている XML ファイルの先頭に配置されているため、スクリプトに問題を引き起こしています。simpleXML は、XML ファイルの形式が整っていないという事実を好まない。エラーを回避しようとしましたが、うまくいかないようでした。誰でもこれを解決する方法を教えてもらえますか?
XML ファイルの形式が正しくない限り、SimpleXML はそれをロードしません...そのため、SimpleXML にフィードする前に、その XML ファイルに対していくつかの文字列操作を行う必要がある場合があります。
この「MEMCACHEの空」が常に同じである場合、str_replaceに基づいた非常に単純なものが機能する可能性があります。そうでなければ、いくつかの正規表現がおそらくうまくいくでしょう;-)
そう :
simplexml_load_string
たぶんそれは本当に「きれい」ではないかもしれません...しかし、うまくいくはずです、速くて簡単です...
たとえば、非 XML が次のようになっている場合:
$xml_string = <<<XML
<!-- MEMCACHE empty -->
<?xml version="1.0" ?>
<data>
<glop>TEST</glop>
<other>GLOP</other>
</data>
XML;
あなたはこれを使いたいかもしれません:
$real_xml_string = str_replace("<!-- MEMCACHE empty -->\n", '', $xml_string);
\n
末尾の " " に注意してください: その改行を削除する必要があります ;-)
次を含む文字列が得られます。
<?xml version="1.0" ?>
<data>
<glop>TEST</glop>
<other>GLOP</other>
</data>
これは整形式の XML です。だからあなたは今それをロードすることができます:
$xml = simplexml_load_string($real_xml_string);
var_dump($xml);
そして、あなたが望むものを手に入れます:
object(SimpleXMLElement)[1]
public 'glop' => string 'TEST' (length=4)
public 'other' => string 'GLOP' (length=4)
MEMCACHE の「ステータス」が常に「空」ではない場合は、正規表現を使用できます。str_replace
呼び出しの代わりに、次のようなことができると思います。
$real_xml_string = preg_replace("#<!-- MEMCACHE (\w+) -->\n#", '', $xml_string);
(ニーズによっては、少し調整する必要があるかもしれません)
もちろん、あなたの場合、$xml_string
ソースコードには保存されませんが、 curl や などを介して取得されるfile_get_contents
と思います。
ファイルの一番上にある場合
<!-- MEMCACHE empty -->
<?xml version="1.0" ?>
<root> ... </root>
次に、空またはnullpreg_replace("/^<!-- MEMCACHE empty -->$/", "", $xml_file)
にするのが最善だと思います。
これ<?xml version="1.0" ?>
は、DOM、SAX、SimpleXML、またはその他のいずれの場合でも有効な XML であるためには、ファイルの最初の行である必要があるためです。