2013-11-26 1 views
1

안녕하세요 나는이 XML이 :의 XMLReader 자식 노드 값

<pola_wlasne> 
    <pole> 
    <nazwa><![CDATA[STAN 1]]></nazwa> 
    <wartosc><![CDATA[5.33]]></wartosc> 
    </pole> 
    <pole> 
    <nazwa><![CDATA[Gatunek]]></nazwa> 
    <wartosc><![CDATA[I]]></wartosc> 
    </pole> 
    <pole> 
    <nazwa><![CDATA[pal]]></nazwa> 
    <wartosc><![CDATA[65,0900]]></wartosc> 
    </pole> 
    <pole> 
    <nazwa><![CDATA[op.]]></nazwa> 
    <wartosc><![CDATA[1,4150]]></wartosc> // <- how to read only this value? 
    </pole> 
</pola_wlasne> 

을 나는 XMLReader를 가진 하나의 노드를 읽고 싶어. 나는 부모의 가치를 읽으려고 애썼다가 다음 노드로 가려고했지만 일하지 않았다.

if ($reader->value == 'op.'){ 
       $reader->next('wartosc'); 
      } 
(..) 
case 'wartosc': 
$reader->value; // <-- read all elements 
break; 

있지만 노드 이름 wartosc에서 모든 값을 읽을했다. 이 XML에 일부 특성을 추가 할 수 없습니다.

답변

1

XMLReader에서 약간 복잡해 지므로 다음 노드를 읽을 때 모든 XML을 반복하고 적절한 플래그를 설정해야합니다. 또한 CDATA 섹션이 있으므로 적절한 값 판독 값을 확인해야합니다.

코드 :

$wartosc = 0; // flags 
$nazwa = 0; 
while ($xml->read()) { 
    if($wartosc && $xml->nodeType == XMLReader::CDATA){ 
    // if we are in proper 'wartosc' node, and it's CDATA section 
     echo $xml->value; // read value 
     break; // end reading 
    } 

    if($xml->name == 'nazwa'){ // if we are in node 'nazwa' 
     $nazwa = 1; // set flag for reading next CDATA 
    } 

    if($nazwa && $xml->nodeType == XMLReader::CDATA){ 
    // if we are in 'nazwa' node, and it's CDATA section 
     if($xml->value == 'op.'){ // .. and it's have 'op.' value 
      $wartosc = 1; // set flag for reading next 'wartosc' node value 
     } else { 
      $xml->next('pole'); // otherwise, skip to next 'pole' node 
     } 
    } 
} 

그래서의 적절한를 반환 : 1,4150 값

Mayby는,이 작업을 수행하는 간단한 방법이 나는 대부분의 경우 SimpleXML을 사용,의 XMLReader와 정확히 익숙하지 해요 .

+0

고마워요 작품 :) – matterix

+0

@matterix 도움이 된 것을 기쁘게, pozdrawiam;) – Wilq