2

解析する必要のあるXML文字列を返すことになっている支払いゲートウェイに接続しています。ただし、WSによって返される文字列には、実際のXMLの前にHTMLヘッダーが含まれています。

私はすでにそこにいる技術者と話をしました、そして彼らはそれが彼らのシステムがどのように機能するかであると言います、そして私はそれで私の方法を管理するべきです。

だから私の質問は:文字列からXMLだけを抽出し、残りを捨てるクリーンで簡単な方法はありますか?

ありがとう!

すべての回答をありがとう!以下に例を追加しました。

HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 300
Content-Type: text/html; charset=utf-8
X-AspNet-Version: 2.0.50727
Date: Fri, 23 Nov 2012 15:02:17 GMT

<?xml version='1.0' encoding='utf-8' standalone='yes' ?><Inicio><Nrocom>xxxxxx</Nrocom><Nroterm>xxxxxx</Nroterm><Moneda>858</Moneda><Importe>000</Importe><Plan>001</Plan><Tcompra>0</Tcompra><Info></Info><Rsp>2222</Rsp><Idtrn>000000</Idtrn></Inicio>Thread was being aborted.Thread was being aborted.

このブロック全体は、このゲートウェイからの通常の応答です。「スレッドが中止されていました。スレッドが中止されていました」は無視してください。メッセージ、彼らは彼らがそれに取り組んでいると言います。

4

3 に答える 3

0

これは、作業しているデータの知識がなくても可能性のある非常に無駄のない例です。

$string = '
<html>
  <head>
    <title>Untitled</title>
  </head>
  <body>
    <xmlroot>
      <item>hello</item>
      <item>world</item>
    </xmlroot>
  </body>
</html>
';

if($xml = new SimpleXMLElement($string) and $item = $xml->xpath('//xmlroot'))
{
  echo $item[0]->asXML();
}
于 2012-11-27T04:01:19.950 に答える
0

だから私はあなたの編集を見たところです。あなたがしたいのは、<?xmlこれだけを見つけて解析することです。

$beginTag = "<?xml";
$xmlDoc = substr($response, strpos($response, $beginTag));

echo $xmlDoc;

このコードは、次の出力を提供します。

<?xml version='1.0' encoding='utf-8' standalone='yes' ?><Inicio><Nrocom>xxxxxx</Nrocom><Nroterm>xxxxxx</Nroterm><Moneda>858</Moneda><Importe>000</Importe><Plan>001</Plan><Tcompra>0</Tcompra><Info></Info><Rsp>2222</Rsp><Idtrn>000000</Idtrn></Inicio>Thread was being aborted.Thread was being aborted.

明らかにXML有効ではありませんが、Thread was being aborted.問題が修正されれば有効な XML を受け取ることができると思います。

于 2012-11-27T04:02:57.280 に答える
0

まあ、なんとなく動くようになりました。

これを完璧な解決策と見なさないでください。これを行うには他にも多くのより良い方法があると確信しています。これを取得するには、正規表現を「学習」する必要があったからです。

考え方は単純で、正規表現を使用し<?xmlて XML のタグと終了タグを取得します。関数 preg_match() は、その間のすべてを $matches 配列に返します。

それが役に立てば幸い。

<?php
$exp = '/<\?xml.*<\/Inicio>/';
preg_match($exp, $string, $matches ,PREG_OFFSET_CAPTURE, 0);
echo $matches[0][0];
?>
于 2012-11-27T19:44:15.247 に答える