-1

私は数年間プログラミングをしていますが、phpはかなり新しいです。

私はプロジェクトに取り組んでおり、最終的な目標は、xmlファイルの特定の要素を毎晩oracleテーブルにロードすることです。毎晩実行され、ローカルマシンにファイルを保存するスクリプトがあります。私は延々と答えを探してきましたが、失敗しました。

これは、xmlファイルの集約された例です。

<?xml version="1.0" encoding="UTF-8" ?> 
<Report account="7869" start_time="2012-02-23T00:00:00+00:00" end_time="2012-02-23T15:27:59+00:00" user="twilson" more_sessions="false">
 <Session id="ID742247692" realTimeID="4306650378">
  <Visitor id="5390643113837">
   <ip>128.XXX.XX.XX</ip> 
   <agent>MSIE 8.0</agent> 
  </Visitor>
 </Session>
 <Session id="ID742247695" realTimeID="4306650379">
  <Visitor id="7110455516320">
    <ip>173.XX.XX.XXX</ip> 
    <agent>Chrome 17.0.963.56</agent> 
   </Visitor>
 </Session>
</Report>

注意すべき点の1つは、xmlファイルには、テーブルにロードする必要のあるいくつかのオブジェクトが含まれていることです。上記の例は、2行のデータのみを対象としています。私はデータを接続してOracleにロードするプロセス全体に精通しており、txtのETLを実行する同様のスクリプトをセットアップしました。とcsv。phpを使用したファイル。残念ながら、この場合、データはxmlに保存されます。csvをロードするときに採用したアプローチ。ファイルは、データを配列にロードし、そこから続行します。

私は似たようなものを使用でき、おそらくそれぞれまたは似たようなものに変数を作成できると確信していますが、xmlを使用してそれを行う方法はあまりよくわかりません。ファイル。

$xml = simplexml_load_file('C:/Dev/report.xml'); 

echo $xml->Report->Session->Visitor->agent;

上記のコードでは、各訪問者に関連付けられているエージェントを返すだけです。これはエラーを返します'11行目のC:\ PHP\chatTest.phpで非オブジェクトのプロパティを取得しようとしています'

最終的な結果は、私が提供した例と同様のテーブルにデータをロードすることです。テーブルに2つの行をロードすると、以下のようになりますが、取得できれば、それを処理できると思います。データを配列などに変換します。

IP|AGENT
128.XXX.XX.XX MSIE 8.0
173.XX.XX.XXX Chrome 17.0.963.56

どんな助けでも大歓迎です。

改訂されたコード:

  $doc = new DOMDocument();
  $doc->load( 'C:/Dev/report.xml' );

  $sessions = $doc->getElementsByTagName( "Session" );
  foreach( $sessions as $session )
  {
  $visitors = $session->getElementsByTagName( "Visitor" );
  foreach( $visitors as $visitor )

  $sessionid = $session->getAttribute( 'realTimeID' );
  {   

  $ips = $visitor->getElementsByTagName( "ip" );
  $ip = $ips->item(0)->nodeValue;

  $agents = $visitor->getElementsByTagName( "agent" );
  $agent = $ips->item(0)->nodeValue;

     echo "$sessionid- $ip- $agent\n";

}}
  ?>
4

2 に答える 2

1

PHP の -> 演算子は、オブジェクトのフィールドまたはメソッドを呼び出そうとしていることを意味します。Report は $xml 内のメソッドではないため、オブジェクト以外のプロパティを呼び出そうとしていることを示すエラーが表示されます。

次のようなことを試すことができます (動作するかどうかわからない、テストしていない、長い間 PHP を書いていませんが、Google で検索できます):

$doc = new DOMDocument();
$doc->loadXML($content);

foreach ($doc->getElementsByTagName('Session') as $node)
{
    $agent = $node->getElementsByTagName('Visitor')->item(0)->getElementsByTagName('agent')->item(0)->nodeValue;
}

編集:

PHP で配列に何かを追加するのは、次のように簡単です。

$arr = array();
$arr[] = "some data";
$arr[] = "some more data";

PHP 配列は、その場でサイズ変更できるため、リストとして表示されます。

于 2012-05-16T20:02:42.967 に答える
0

DOM アプローチではなく simplexml_load_file を使用して、これを理解することができました。DOM は Leon の提案を変更した後に機能しますが、以下のアプローチは私が提案するものです。

$xml_object = simplexml_load_file('C:/Dev/report.xml');

foreach($xml_object->Session as $session) {
        foreach($session->Visitor as $visitor) {
        $ip = $visitor->ip;
        $agent = $visitor->agent;
    }

echo $ip.','.$agent."\n";
}
于 2012-06-01T17:38:51.427 に答える