2011-12-07 32 views
2

このコードは、大きなXMLファイルを解析する際に非効率的な結果を生成しています。PHPのdomdocumentが正しく解析されない

解析されるXMLは次のようになります。

<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> 

製品の約100セット(そう基本的には上記のXML回100)

はたったの約3 - がある場合に、このコードは動作しますがあります5は製品を設定しますが、サイズが大きくなった場合は設定しません。 大きなファイルの場合はなぜ機能しないのですか?私はかなり大きなxmlファイル(1を解析するために、このPHPコードを使用する場合

<?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ファイルは、各製品のため、このように見えるようになっているが、しかし、

<?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> 

を設定しましたcategoryPathノードとその子ノードを取り、ファイルの最下部に追加します(製品の場合は )小さな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

関連する問題