使用PHP解析大型嵌套XML表的最佳方法?

时间:2010-08-02 12:55:26

标签: php xml

我正在尝试用PHP解析一个非常大的XML表,但我对它很新。 XML表包含数千条记录。

以下是工作表中使用的结构示例:

<familyList>
<family>
<familyID>1234</familyID>
<familyDescription>The Jonathans</familyDescription>
<childrenList>
<child>Suzan</child>
<child>Fred</child>
<child>Harry</child>
</childrenList>
</family>
<family>
<familyID>1235</familyID>
<familyDescription>The Gregories</familyDescription>
<childrenList>
<child>Anthony</child>
<child>Lindsay</child>
</childrenList>
</family>
</familyList>

由于我对使用PHP的XML解析相当陌生,我想知道将这个嵌套的XML表解析成数组的最佳方法是什么。我需要将XML转换为数组,以便之后可以将数据插入MySQL数据库。

你能不能给我一个正确的方向,因为我没有成功地解决问题的解决方案?...

谢谢!

2 个答案:

答案 0 :(得分:5)

解析大型XML文件时,应使用XML Pull Parser(XPP)来执行此操作。 PHP有一个pull解析器的实现,它被称为XMLReader。将XML存储为大文件的数组也会占用大量内存。

我建议您使用XMLReader并在解析数据时,可以将其插入数据库而无需等待文件结束。它不会使用大量内存,而且会更快。

This tutorial可以帮助理解如何在PHP中使用XMLReader。

已指出评论XML Parser是否可以是解析大型XML文件的其他解决方案。

答案 1 :(得分:0)

DOMDocument有许多用于访问,更新和输出格式化XML的优秀方法。关于转换为数组,我建议在数组中使用对象,这是PHP完全没问题的,我发现语法比数组更清晰,以便跟踪这个层次结构。

 <?php


// load xml families, could split this into different files..
$families = new DOMDocument();
$families->load("/xml/families.xml"); // your xml file

$families_items = $families->getElementsByTagName("family");

$my_cool_array = null;  // reset this variable for being set as an array literal later

foreach( $families_items as $family_item) {

    $toinsert = null; // reset the object literal

    $toinsert->family_id = $family_item->getElementsByTagName('familyID')->nodeValue;
    $toinsert->familyDescription= $family_item->getElementsByTagName('familyDescription')->nodeValue;

    $children = $family_item->getElementsByTagName('childrenList')->childNodes;


    // children
    foreach ($children as $child) {
        $child_toinsert[]->name = $child->nodeValue;
    }
    // etc for your details, syntax might be a bit off, but should get you started

    $toinsert->children = $child_toinsert;


    // build array of objects
    $my_cool_array_of_families[] = $toinsert;



}


var_dump($my_cool_array);

像这样的东西,仔细检查语法,但它正在路上;)