2011-12-07 75 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套产品,但不会增加尺寸。 为什么它不适用于更大的文件?

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

每名节点,不属于产品节点内追加。

+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