我正在尝试用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数据库。
你能不能给我一个正确的方向,因为我没有成功地解决问题的解决方案?...
谢谢!
答案 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);
像这样的东西,仔细检查语法,但它正在路上;)