php domdocument неправильно анализирует - PullRequest
2 голосов
/ 07 декабря 2011

Этот код дает неэффективные результаты, когда я использую его для анализа большого файла XML.

Анализируемый 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 наборовproduct (так, в основном, выше xml умножить на 100)

Этот код работает, когда есть только 3-5 комплектов товара, но не когда он увеличивается в размере.Почему он не работает для больших файлов?

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

Однако, когдаЯ использую этот PHP-код для анализа довольно большого XML-файла (один со 100 наборами продуктов), он берет узел categoryPath и его дочерние элементы и добавляет их в конец файла, не учитывая узел, в котором он должен находиться (product)Если я проанализирую только небольшой XML-файл (тот, который имеет 3 набора продукта), то я получу желаемый результат (приведенный выше XML-код - это то, что должен делать этот PHP-код, но он не работает при наличии большого файла).

Когда я пытаюсь проанализировать XML-файл, содержащий 100 наборов продуктов, результат выглядит следующим образом:

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

Каждый из узлов имени не добавляется внутри узла продукта.

1 Ответ

1 голос
/ 07 декабря 2011

Это работает?

<code>// 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).'
';

Проверено на ц. 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>
...