2012-04-30 5 views
0

私はPHPで解析する必要がある非常に大きなファイルを持っているので、xmlReaderを使用しています。私は、XMLで遊んといくつかの問題を抱えています始めました....私は読むために、次の機能を使用しようとしていますxmlReader in PHP-正しく動作させるための問題

ここ

XMLが構成されている方法です...

<?xml version="1.0" encoding="utf-8"?> 
    <devices> 
     <os name="os1"> 
      <device user_agent="uaValue1"> 
       <device_name>name1</device_name> 
       <device_os>osValue1</device_os> 
      </device> 
      <device user_agent="uaValue2"> 
       <device_name>name2</device_name> 
       <device_os>osValue2</device_os> 
      </device> 
     </os> 
     <os name="os2"> 
      <device user_agent="uaValue3"> 
       <device_name>name3</device_name> 
       <device_os>osValue5</device_os> 
      </device> 
      <device user_agent="uaValue4"> 
       <device_name>name4</device_name> 
       <device_os>osValue4</device_os> 
      </device> 
     </os> 
     <manufacturer name="mf1"> 
      <device user_agent="uaValue5"> 
       <device_name>name5</device_name> 
       <device_os>osValue5</device_os> 
      </device> 
      <device user_agent="uaValue6"> 
       <device_name>name6</device_name> 
       <device_os>osValue6</device_os> 
      </device>  
     </manufacturer> 
     <manufacturer name="mf2"> 
      <device user_agent="uaValue7"> 
       <device_name>name7</device_name> 
       <device_os>osValue7</device_os> 
      </device> 
      <device user_agent="uaValue8"> 
       <device_name>name8</device_name> 
       <device_os>osValue8</device_os> 
      </device>  
     </manufacturer> 
    </devices> 

xml($ findbyはosまたはmanufacturerを渡します。/ $ atr_valueは$ findby値の属性名/ $ ua_strはユーザエージェントです)。ここにあるいくつかの値をエコーすることにより

function get_data($findby,$atr_value,$ua_str) { 
    $data['device_name'] = ''; 
    $data['device_os'] = ''; 

    $xml = new XMLReader; 
    $xml->open('devices.xml'); 

    while($xml->read()) { 
     if ($xml->name == $findby) { 
      if ($xml->getAttribute('name') == $atr_value) { 
       while($xml->read()) { 
        if ($xml->name == "device") { 
         if ($xml->getAttribute('user_agent') == $ua_str) { 
          while($xml->read()) {        
           if ($xml->name == "device_name") { 
            $data['device_name'] = $xml->value; 
           } 
           if ($xml->name == "device_os") { 
            $data['device_os'] = $xml->value; 
           } 
          } 
         } 
        }     
       } 
      } 
     } 
    } 
    $xml->close(); 
    return $data; 
} 

、ダウンし、ユーザエージェントにデータを引っ張っているようだが、デバイス名またはdevice_osを取得することはできません。

明らかに、これは機能しません。私は、XMLがそのような方法で構造化できないことが問題であり、簡単な修正であると考えていました。しかし、以前のバージョンではデータを取得しましたが、間違ったユーザーエージェントからのものでした。だから、私はそれがxmlReaderでデータを引き出す方法で何かだと思っています。

これはなぜ動作しないのですか?ありがとうございました...

答えて

0

外側whileループのタグタイプはチェックしていません。 XMLReaderは、開始タグ、終了タグ、タグコンテンツを送信し、それらのイベントの少なくとも一部を処理する必要があります。

外部ループでは、オープニングの場合は$reader->nodeType == XMLReader::ELEMENT、終了の場合はXMLReader::END_ELEMENT、タグのコンテンツの場合はXMLReader::TEXTにチェックします。他にもたくさんあります - このクラスのPHPドキュメント(values 0-17)を見てください。

+0

おかげで...私は属性として望んでいた要素を追加し、データを取得するので、同じようにそれを呼び出すことになりました – user1366187

0

私はちょうど...助けたことを

function get_data($ua_str) { 
    $data = array(); 

    $xml = new XMLReader; 
    $xml->open('devices.xml'); 

    while($xml->read()) { 
     if ($xml->nodeType == XMLReader::ELEMENT && $xml->name == 'device') { 
      while($xml->read()) { 
       if ($xml->getAttribute('user_agent') == $ua_str) { 
        $data['device_mf'] = $xml->getAttribute('device_mf'); 
        $data['device_os'] = $xml->getAttribute('device_os'); 
        $data['device_name'] = $xml->getAttribute('device_name'); 
       } 
      } 
     } 
    } 
    $xml->close(); 
    return $data; 
} 
関連する問題