使用 XMLReader 读取子节点 [英] Reading Child Nodes with XMLReader

查看:26
本文介绍了使用 XMLReader 读取子节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写一个 XMLReader/SimpleXML 混合函数来读取一个非常大 (700MB) 的 XML 文件.XML 格式如下:

I'm trying to write an XMLReader/SimpleXML hybrid function to read a very large (700MB) XML file. The XML is in this format:

<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>

我到目前为止编写的代码:

The code I have written so far to do this:

$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 似乎是前进的方向,但还没有快乐.

However, while the ItemKey node value is being inserted into the array, the English Name is not, I can't seem to access this node properly. I would just use XMLReader for everything but since there are repeat occurences of the English node (one for Name, another for Description) from my Googling so far SimpleXML seemed the way forward, but no joy as yet.

有什么建议吗?有什么好的指导吗?与许多其他 PHP 功能相比,php.net 上的 XMLReader 文档非常缺乏,而且通常似乎很难找到清晰简洁的详细指南.

Any suggestions? Any good guides? XMLReader documentation on php.net is woefully lacking in comparison to many other PHP features, and in general it seems hard to find detailed guides that are clear and concise.

推荐答案

没关系,想通了.对于任何陷入困境的人:

Nevermind, figured it out. For anyone else who gets stuck on this:

$xml = new XMLReader();
if(!$xml->open('Items.xml')){
    die('Failed to open file!');
} else {
    echo 'File opened';
}

$items = array();

while ($xml->read() && $xml->name !== "Item");
while ($xml->name === "Item") {
    $item = array();
    $node = new SimpleXMLElement($xml->readOuterXML());
    $item['itemkey'] = $node->ItemKey;
    $item['englishName'] = $node->Name->English;
    $item['englishDesc'] = $node->Description->English;
    $items[] = $item;
}

这篇关于使用 XMLReader 读取子节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆