php domdocument无法正确解析

时间:2011-12-07 09:53:41

标签: php xml dom domdocument

当我使用它来解析大型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套产品(所以基本上是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节点及其子节点并将它们附加到文件的底部而忽略了它所假设的节点进入(产品)  如果我只解析一个小的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>

每个名称节点都不会附加到产品节点中。

1 个答案:

答案 0 :(得分: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>