Heim > Backend-Entwicklung > PHP-Tutorial > 如何解析300M+的XML文件?

如何解析300M+的XML文件?

WBOY
Freigeben: 2016-06-06 20:35:05
Original
1330 Leute haben es durchsucht

背景:
1、手上有几个大的xml文件,基本都在300M至600M之间;
2、XML内容包括title,co-author,abstract,Affiliation等;
3、用的是xmlreader进行解析;

遇到的问题:
如果解析所有内容,经常只能把XML文件的一部分解析出来,似乎是内存不够的迹象;
如果只把title或Affiliation单独解析出来,就能全部解析XML文件;

附上代码:

<code>set_time_limit(0);
header("Content-Type: text/html;charset=utf-8");
$num=0;
$reader = new XMLReader();
$reader->open("JACS.xml");
while ($reader->read()) {

    if($reader->nodeType==XMLREADER::ELEMENT) {
             if ($reader->localName == "PubmedArticle") {
                  $num++;
                  echo 'Number:'.$num;
                    while ($reader->read()) {
                       if ($reader->nodeType == XMLREADER::ELEMENT) {
                                if ($reader->localName == "PubDate") {
                                     while ($reader->read()){
                                         if ($reader->nodeType == XMLREADER::ELEMENT) {
                                               if ($reader->localName == "Year") {
                                                   $reader->read();
                                                   echo 'PublicationDate:'.$reader->value.' ';
                                                   break;
                                               }

                                         }
                                     }
                                     while ($reader->read()){
                                         if ($reader->nodeType == XMLREADER::ELEMENT) {
                                               if ($reader->localName == "Month") {
                                                   $reader->read();
                                                   echo $reader->value.' ';
                                                   break;
                                               }

                                         }
                                     }
                                     while ($reader->read()){
                                         if ($reader->nodeType == XMLREADER::ELEMENT) {
                                               if ($reader->localName == "Day") {
                                                   $reader->read();
                                                   echo $reader->value;
                                                   break;
                                               }

                                         }
                                     }
                                     echo '<br>';
                                     break;
                                   }

                            }
                        }

                    while ($reader->read()) {
                       if ($reader->nodeType == XMLREADER::ELEMENT) {
                                if ($reader->localName == "Title") {
                                    $reader->read();
                                    echo 'JournalName:'.$reader->value.'<br>';
                                    break;
                                }

                       }
                    }

                    while ($reader->read()) {
                       if ($reader->nodeType == XMLREADER::ELEMENT) {
                                if ($reader->localName == "ArticleTitle") {
                                    $reader->read();
                                    echo 'ArticleTitle:'.$reader->value.'<br>';
                                    break;
                                }

                       }
                    }

                    while ($reader->read()) {
                       if ($reader->nodeType == XMLREADER::ELEMENT) {
                                if ($reader->localName == "AbstractText") {
                                    $reader->read();
                                    echo 'Abstract:'.$reader->value.'<br><br>';
                                    break;
                                }

                       }
                    }




                    while ($reader->read()) {
                       if ($reader->nodeType == XMLREADER::ELEMENT) {
                                if ($reader->localName == "Affiliation") {
                                    $reader->read();
                                    echo 'Affiliation:'.$reader->value.'<br><br>';
                                    break;
                                }

                       }
                    }

                  }
                }
            }
    $reader->close();
}
</code>
Nach dem Login kopieren
Nach dem Login kopieren

回复内容:

背景:
1、手上有几个大的xml文件,基本都在300M至600M之间;
2、XML内容包括title,co-author,abstract,Affiliation等;
3、用的是xmlreader进行解析;

遇到的问题:
如果解析所有内容,经常只能把XML文件的一部分解析出来,似乎是内存不够的迹象;
如果只把title或Affiliation单独解析出来,就能全部解析XML文件;

附上代码:

<code>set_time_limit(0);
header("Content-Type: text/html;charset=utf-8");
$num=0;
$reader = new XMLReader();
$reader->open("JACS.xml");
while ($reader->read()) {

    if($reader->nodeType==XMLREADER::ELEMENT) {
             if ($reader->localName == "PubmedArticle") {
                  $num++;
                  echo 'Number:'.$num;
                    while ($reader->read()) {
                       if ($reader->nodeType == XMLREADER::ELEMENT) {
                                if ($reader->localName == "PubDate") {
                                     while ($reader->read()){
                                         if ($reader->nodeType == XMLREADER::ELEMENT) {
                                               if ($reader->localName == "Year") {
                                                   $reader->read();
                                                   echo 'PublicationDate:'.$reader->value.' ';
                                                   break;
                                               }

                                         }
                                     }
                                     while ($reader->read()){
                                         if ($reader->nodeType == XMLREADER::ELEMENT) {
                                               if ($reader->localName == "Month") {
                                                   $reader->read();
                                                   echo $reader->value.' ';
                                                   break;
                                               }

                                         }
                                     }
                                     while ($reader->read()){
                                         if ($reader->nodeType == XMLREADER::ELEMENT) {
                                               if ($reader->localName == "Day") {
                                                   $reader->read();
                                                   echo $reader->value;
                                                   break;
                                               }

                                         }
                                     }
                                     echo '<br>';
                                     break;
                                   }

                            }
                        }

                    while ($reader->read()) {
                       if ($reader->nodeType == XMLREADER::ELEMENT) {
                                if ($reader->localName == "Title") {
                                    $reader->read();
                                    echo 'JournalName:'.$reader->value.'<br>';
                                    break;
                                }

                       }
                    }

                    while ($reader->read()) {
                       if ($reader->nodeType == XMLREADER::ELEMENT) {
                                if ($reader->localName == "ArticleTitle") {
                                    $reader->read();
                                    echo 'ArticleTitle:'.$reader->value.'<br>';
                                    break;
                                }

                       }
                    }

                    while ($reader->read()) {
                       if ($reader->nodeType == XMLREADER::ELEMENT) {
                                if ($reader->localName == "AbstractText") {
                                    $reader->read();
                                    echo 'Abstract:'.$reader->value.'<br><br>';
                                    break;
                                }

                       }
                    }




                    while ($reader->read()) {
                       if ($reader->nodeType == XMLREADER::ELEMENT) {
                                if ($reader->localName == "Affiliation") {
                                    $reader->read();
                                    echo 'Affiliation:'.$reader->value.'<br><br>';
                                    break;
                                }

                       }
                    }

                  }
                }
            }
    $reader->close();
}
</code>
Nach dem Login kopieren
Nach dem Login kopieren

可以参考一下 这个 PHP处理比较大的XML文件

为啥要装那么大 txt打开那么大也死机了 多分几个文件吧

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage