2012-04-30 2 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_NAME 또는 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; 
} 
관련 문제