【问题标题】:php domdocument not parsing correctlyphp domdocument 解析不正确
【发布时间】:2012-01-14 20:22:49
【问题描述】:

当我使用它来解析大型 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>

每个名称节点都没有附加到产品节点内。

【问题讨论】:

  • “它不起作用”到底是什么意思?发生什么了?出现什么错误?
  • 什么是“无效结果”?为什么要使用 file_put_contents 来写入文件?上面的代码到底在做什么?
  • 我更新了答案。代码用转换后的 XML 写入一个新文件
  • 感谢您的更新,但“它无法正常工作”不足以作为描述。

标签: php xml dom domdocument


【解决方案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 个&lt;product&gt; 标签,结果如下:

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

【讨论】:

  • 我用 3 测试了它。我现在用整个 XML 文件运行它。这需要很长时间。
猜你喜欢
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 2011-11-17
  • 1970-01-01
  • 2016-07-18
  • 2018-11-21
相关资源
最近更新 更多