我正在尝试编写一个XMLReader/SimpleXML混合函数来读取一个非常大的(700MB)XML文件。该XML的格式如下:用XMLReader读取子节点
<Items>
<Item>
<ItemKey>ABCDEF123</ItemKey>
<Name>
<English>An Item Name</English>
<German>An Item Name In German</German>
<French>An Item Name In French</French>
</Name>
<Description>
<English>An Item Description</English>
<German>An Item Description In German</German>
<French>An Item Description In French</French>
</Description>
</Item>
<Item>
<ItemKey>GHIJKL456</ItemKey>
<Name>
<English>Another Item Name</English>
<German>Another Item Name In German</German>
<French>Another Item Name In French</French>
</Name>
<Description>
<English>Another Item Description</English>
<German>Another Item Description In German</German>
<French>Another Item Description In French</French>
</Description>
</Item>
</Items>
到目前为止,我写的代码来做到这一点:
$xml = new XMLReader();
if(!$xml->open('testitems.xml')){
die('Failed to open file!');
} else {
echo 'File opened';
}
$items = array();
while ($xml->read()){
if($xml->nodeType == XMLReader::ELEMENT){
if ($xml->name == 'Item'){
$item = array();
}
if ($xml->name == 'ItemKey'){
$xml->read();
$item['itemKey'] = $xml->value;
}
if ($xml->name == 'Name'){
$sxml = new SimpleXMLElement($xml->readOuterXml());
$englishName = $sxml->English;
$item['englishName'] = $englishName;
}
}
if($xml->nodeType == XMLReader::END_ELEMENT){
if ($xml->name == 'Item'){
$items[] = $item;
}
}
}
var_dump($items);
$xml->close();
然而,当的ItemKey节点值被插入到阵列中,英文名称为不,我似乎无法正确访问此节点。我只是用XMLReader来处理所有事情,但是由于从目前为止我的谷歌搜索中重复出现了英文节点(一个用于名称,另一个用于描述),SimpleXML似乎是前进的方向,但目前还没有喜悦。
有什么建议吗?任何好的导游? php.net上的XMLReader文档与许多其他PHP功能相比是非常缺乏的,通常看起来很难找到清晰简洁的详细指南。
这基本上就是我所拥有的,但它仍然不清楚为什么你的原始代码不起作用。正如我已经回答的那样,我确实运行了它,并且它在我的最后工作。在这里你几乎做同样的事情,现在也运行。 – hakre
是的,我最初写了类似于这个工作版本的东西,它不会通过SimpleXML给我节点值,然后突然它。奇怪,但在编码时似乎很常见,哈哈。可能是一个小的语法错误。 顺便说一句,我看到你发布你的解决方案之前,并注意到有人评论说,XMLReader/SimpleXML混合(我采取的路线)比纯XMLReader方法更快,你试过两种方法吗?哪个更快?我设法在53秒内解析大约90k条记录,这与我的SimpleXML only方法(2小时!)相比有了很大的改进 – MikeK
好吧,如果仔细观察,混合方法就是我的答案的一部分:'$ item-> asSimpleXML();'这将返回 - 猜测:) - 是的。它只是在其中实施,所以我不需要再在意了。由于libxml版本的原因,它也支持不支持'readOuterXML()'的系统。由于迭代器只是一个附加组件,您可以说这基本上是一样的。在你的情况下,你可以做一个额外的技巧,我会破解它,并扩大我的答案只是为了可读性。 – hakre