首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php domdocument不能正确解析

php domdocument不能正确解析
EN

Stack Overflow用户
提问于 2011-12-07 17:53:41
回答 1查看 390关注 0票数 2

当我使用这段代码解析一个大的XML文件时,它会产生无效的结果。

解析的XML如下所示:

代码语言:javascript
复制
 <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组产品时,此代码可以工作,但当它的大小增加时则不起作用。为什么它不适用于更大的文件?

代码语言:javascript
复制
  <?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文件应如下所示

代码语言:javascript
复制
<?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文件时,结果如下所示:

代码语言:javascript
复制
<?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>

每个name节点都不会附加在product节点中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-07 19:53:54

这行得通吗?

代码语言:javascript
复制
// 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>';

在约100个<product>标签上进行测试,结果如下:

代码语言:javascript
复制
<?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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8413365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档