0
 <!-- MEMCACHE empty -->

上記は、リモートでアクセスしようとしている XML ファイルの先頭に配置されているため、スクリプトに問題を引き起こしています。simpleXML は、XML ファイルの形式が整っていないという事実を好まない。エラーを回避しようとしましたが、うまくいかないようでした。誰でもこれを解決する方法を教えてもらえますか?

4

2 に答える 2

1

XML ファイルの形式が正しくない限り、SimpleXML はそれをロードしません...そのため、SimpleXML にフィードする前に、その XML ファイルに対していくつかの文字列操作を行う必要がある場合があります。

この「MEMCACHEの空」が常に同じである場合、str_replaceに基づいた非常に単純なものが機能する可能性があります。そうでなければ、いくつかの正規表現がおそらくうまくいくでしょう;-)

そう :

  • リモートファイルを文字列に取得します
  • 最初のことを抑圧する
  • その文字列を渡すsimplexml_load_string

たぶんそれは本当に「きれい」ではないかもしれません...しかし、うまくいくはずです、速くて簡単です...


たとえば、非 XML が次のようになっている場合:

$xml_string = <<<XML
&lt;!-- MEMCACHE empty --&gt;
<?xml version="1.0" ?>
<data>
    <glop>TEST</glop>
    <other>GLOP</other>
</data>
XML;

あなたはこれを使いたいかもしれません:

$real_xml_string = str_replace("&lt;!-- MEMCACHE empty --&gt;\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("#&lt;!-- MEMCACHE (\w+) --&gt;\n#", '', $xml_string);

(ニーズによっては、少し調整する必要があるかもしれません)


もちろん、あなたの場合、$xml_stringソースコードには保存されませんが、 curl や などを介して取得されるfile_get_contentsと思います。

于 2009-08-13T17:32:46.227 に答える
0

ファイルの一番上にある場合

&lt;!-- MEMCACHE empty --&gt;
<?xml version="1.0" ?>
<root> ... </root>

次に、空またはnullpreg_replace("/^&lt;!-- MEMCACHE empty --&gt;$/", "", $xml_file)にするのが最善だと思います。

これ<?xml version="1.0" ?>は、DOM、SAX、SimpleXML、またはその他のいずれの場合でも有効な XML であるためには、ファイルの最初の行である必要があるためです。

于 2009-08-13T17:31:45.560 に答える