2012-04-30 53 views
0

我有一個非常大的文件,我需要在php中解析,所以我使用的是xmlReader。我剛開始使用XML玩弄和我有一些問題....PHP中的xmlReader-使它正常工作的問題

這裏是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或製造商/ $ 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_NAME或device_os。

顯然,這是行不通的。我在想這個XML不能以這種方式構建,這可能是問題,也是一個簡單的解決方法。但是,在我之前的版本中,它拉取了數據,但它來自錯誤的用戶代理。所以我認爲這是我試圖用xmlReader獲取數據的東西。

有沒有人有任何想法,爲什麼這不起作用?謝謝...

回答

0

你沒有檢查外循環中的標籤類型。 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; 
}