2011-12-07 3 views
2

이 코드는 큰 XML 파일을 구문 분석 할 때 비효율적 인 결과를 산출합니다. 이 같은 모습을 구문 분석php domdocument가 올바르게 구문 분석되지 않습니다.

XML은 : 약 3있을 때

<product> 
<ItemId>1576829</ItemId> 
<modelNumber>CX501</modelNumber> 
<categoryPath><category><name>Buy</name></category> 
<category><name>Car, Marine &amp; GPS</name></category> 
<category><name>Car Audio</name></category> 
<category><name>Car Stereos</name></category> 
<category><name>CD Decks</name></category></categoryPath> 
</product> 

(그래서 기본적으로 위의 XML을 100 배) 제품의 약 100 세트를이 코드는 작동

있다 5 세트 제품,하지만 증가하지 않을 때 크기. 더 큰 파일에는 왜 작동하지 않습니까? 이 코드가 실행 된 후, XML 파일은 각 제품에 대해 다음과 같이 가정한다

<?php 

set_time_limit(0); 
    // load up your XML 
$xml = new DOMDocument; 
$xml->load('file.xml');  

// Array to store them 
$append = array(); 
foreach ($xml->getElementsByTagName('product') as $product) 
{ 
    foreach($product->getElementsByTagName('name') as $name) { 
     // Stick $name onto the array 

     $append[] = $name; 

} 
// Now append all of them to product 
     foreach ($append as $a) 
{ 
    $product->appendChild($a); 
} 
    $product->removeChild($xml->getElementsByTagName('categoryPath')->item(0)); 
} 


    // final result: 
    $result = $xml->saveXML(); 
    echo $result; 
    $file =  "new_file.xml"; 
    file_put_contents($file,$result); 
?> 

, 그러나

<?xml version='1.0'?> 
<products> 
<product> 
<ItemId>531670</ItemId> 
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber> 
<name>Buy</name></category> 
<name>Car, Marine &amp; GPS</name> 
<name>Car Installation Parts</name> 
<name>Deck Installation Parts</name> 
<name>Antennas &amp; Adapters</name> 
</product> 
</products> 

을 설정 난 (오히려 큰 XML 파일을 구문 분석 한이 PHP 코드를 사용하는 경우 100 세트의 제품), categoriesPath 노드와 해당 하위 노드를 가져 와서 파일의 맨 아래에 추가합니다 (제품) 작은 XML 파일 (3 제품 세트), 원하는 결과를 얻을 것입니다 (위의 XML 코드는이 PHP 코드가 수행해야하는 작업이지만, 큰 파일).

나는 100 제품이있는 XML 파일을 구문 분석하려고

는 결과는 다음과 같습니다 설정 : 이름 노드의 각 제품 노드 내부에 추가되지 않습니다

<?xml version='1.0'?> 
<products> 
<product> 
<ItemId>531670</ItemId> 
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber> 
</product> 
</products> 
<name>Buy</name></category> 
<name>Car, Marine &amp; GPS</name> 
<name>Car Installation Parts</name> 
<name>Deck Installation Parts</name> 
<name>Antennas &amp; Adapters</name> 

.

+0

"작동하지 않습니다"는 정확히 의미할까요? 무슨 일이야? 어떤 오류가 나옵니까? –

+0

"비효율적 인 결과"란 무엇입니까? file_put_contents를 사용하여 파일을 쓰는 이유는 무엇입니까? 그리고 어쨌든 위의 코드는 무엇입니까? – Gordon

+0

답변을 업데이트했습니다. 이 코드는 변환 된 XML을 사용하여 새 파일을 작성합니다. – Ben

답변

1

이 방법이 유용합니까?

// load up your XML 
$xml = new DOMDocument; 
$xml->loadXml(' 

<products> 
    <product> 
    <ItemId>1576829</ItemId> 
    <modelNumber>CX501</modelNumber> 
    <categoryPath><category><name>Buy</name></category> 
    <category><name>Car, Marine &amp; GPS</name></category> 
    <category><name>Car Audio</name></category> 
    <category><name>Car Stereos</name></category> 
    <category><name>CD Decks</name></category></categoryPath> 
    </product> 

<product> 
    <ItemId>1576829</ItemId> 
    <modelNumber>CX501</modelNumber> 
    <categoryPath><category><name>Buy</name></category> 
    <category><name>Car, Marine &amp; GPS</name></category> 
    <category><name>Car Audio</name></category> 
    <category><name>Car Stereos</name></category> 
    <category><name>CD Decks</name></category></categoryPath> 
    </product> 
</products> 

');  

// Array to store them 


foreach ($xml->getElementsByTagName('product') as $product) 
{ 
    $append = array(); 

    foreach($product->getElementsByTagName('name') as $name) { 
    // Stick $name onto the array 
    $append[] = $name; 
} 

    foreach ($append as $a) { 
       // Now append all of them to product 
      $product->appendChild($a); 
    } 
    $product->removeChild($xml->getElementsByTagName('categoryPath')->item(0)); 
} 

// final result: 
$result = $xml->saveXML(); 
echo '<pre>'.print_r(htmlspecialchars($result),1).'</pre>'; 

c. 100 <product> 태그의 결과는 다음과 같습니다.

<?xml version="1.0"?> 
<products> 
    <product> 
<ItemId>1576829</ItemId> 
<modelNumber>CX501</modelNumber> 

<name>Buy</name> 
    <name>Car, Marine &amp; GPS</name> 
<name>Car Audio</name> 
<name>Car Stereos</name> 
<name>CD Decks</name> 
    </product> 

<product> 
    <ItemId>1576829</ItemId> 
    <modelNumber>CX501</modelNumber> 

    <name>Buy</name> 
    <name>Car, Marine &amp; GPS</name> 
    <name>Car Audio</name> 
    <name>Car Stereos</name> 
    <name>CD Decks</name> 
    </product> 

    // etc 
</products> 
+0

3으로 테스트했습니다. 이제 전체 XML 파일로 실행하고 있습니다. 그것은 오랜 시간이 걸립니다. – Ben

관련 문제