2017-12-27 19 views
0

예를 들어 XML 파일에 수백 만 개의 "item"요소가있는 경우 1 ~ 100 "item"요소를 건너 뛸 수 있고 "item"요소 번호 101에서 읽으시겠습니까?PHP XMLReader가 특정 노드 요소 번호에서 읽기 시작

XML 예제 :

<items> 
    <item> 
     <name>ABC</name> 
     <price currency='USD'>100</price> 
    </item> 
    <item> 
     <name>DEF</name> 
     <price currency='USD'>120</price> 
    </item> 
    <!-- .... and a lot more item elements --> 
</items> 
여기

내 현재 코드입니다 : 당신이 위에서 볼 수

$z = new XMLReader; 
$z->open('1.xml'); 
$doc = new DOMDocument; 
while ($z->read() && $z->name !== 'item'); 
$i = 1; 
while ($z->name === 'item'){ 
    if($i<=100){ 
     $z->next('item'); 
    }else{ 
     $node = new SimpleXMLElement($z->readOuterXML()); 
     //doing my stuff here, extracting the node information of that <item> 
     $z->next('item'); 
    } 
    $i++; 
} 

, 난 그냥 항목 번호 1-100을 건너 뛸 "다음"사용하지만,이 매우 효율적이지 않습니다. 여러분이 도와 주시면 감사하겠습니다. 감사!!

시도 @DHRUV 굽타의 솔루션 : 오류 : "메모리 오류에서 파서 오류"

$xml=simplexml_load_file('1.xml',"SimpleXMLElement", LIBXML_COMPACT | LIBXML_PARSEHUGE); 
$xml = json_encode($xml); 
$xml = json_decode($xml,true); 
for($i=99; $i<=104; $i++){ 
    echo $xml["item"][$i]["name"]."<br />"; 
} 

하지만 얻었다.

+0

대신 1 100를 건너에서

증가 PHP 메모리 제한 노드를 사용하여 XML을 읽어보십시오. – Hkachhia

+0

@Hkachhia 당신은 더 설명 할 수 있습니까? –

+0

문제는 실제로 데이터를 읽지 않으면 각 요소의 크기를 알 수 없다는 것입니다. –

답변

0

예 가능한 경우 항목을 반복하고 99 번째 항목부터 시작해야합니다. 예를 들어 : -

$xml=simplexml_load_string($myXMLData) or die("Error: Cannot create object"); 
$xml = json_encode($xml); // encoding in json format 
$xml = json_decode($xml,true); // again decode with second parameter true to get object as array 
for($i=99; $i<count($xml['items']); $i++){ 
    // here you can use $xml['items'][$i] which will be 100th element 
} 

큰 파일의 경우는 기능을 simplexml_load_string에 LIBXML_PARSEHUGE 플래그를 사용해야합니다.

simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_COMPACT | LIBXML_PARSEHUGE) 

XML_PARSE_HUGE 플래그는 구문 분석기에서 하드 코딩 된 모든 제한을 완화합니다. 이는 문서 또는 엔티티 재귀의 ​​최대 깊이와 텍스트 노드의 크기 제한 같은 제한에 영향을줍니다. 큰 파일의 경우

ini_set('memory_limit','1024M'); 
+0

안녕하세요 @DHRUV GUPTA 대답을 주셔서 감사하지만이 경우 XML 파일이 매우 큰 2GB + + 및 simplexml_load_string 사용하여로드하는 데 시간이 오래 걸릴 때문에 simplexml_load_string 사용할 수 없습니다. –

+0

@JohnFive 큰 파일의 경우 simplexml_load_string 함수에서 LIBXML_PARSEHUGE 플래그를 사용해야합니다. 설명을 위해 업데이트 된 답변을 확인하십시오. –

+0

해결책을 시도했지만 작동하지 않습니다. "파서 오류 : 메모리 부족 오류"를 표시합니다. 내 첫 번째 게시물에 추가되었습니다. –