如何使用XMLReader提取元素

时间:2013-07-30 02:05:11

标签: php xml xmlreader

我有一个大型XML文件(4GB),我正在解析并导入到数据库中。我一直在玩XMLReader,但似乎无法使用它,PHP文档没有很多例子可以使用。

我的目标是从我正在使用的XML文件的以下(简化版)中提取“url”和“text”的组合:

<everything>
   <doc>
      <field1>...</field2>
      <url>www.theurlthatIwant.com</url>
      <text>This is some text which I want to extract with the url</text>
      <random>
         <subrandom> </subrandom>
         <subrandom> </subrandom>
         <subrandom> </subrandom>
      </random>
   </doc>
   <doc>
      <field1>...</field2>
      <url>www.anotherurl.com</url>
      <text>This is some more text which I want to extract with the url</text>
      <random>
         <subrandom> ... </subrandom>
         <subrandom> ...  </subrandom>
         <subrandom> ... </subrandom>
      </random>
   </doc>
   ...
</everything>

使用XMLReader抓取“url”和“text”以及忽略其余部分的伪代码是什么?我计划将对输出到CSV文件以进一步(更容易)处理。谢谢!

更新:

想出来,在下面为未来的读者发布答案。

1 个答案:

答案 0 :(得分:0)

我终于开始工作了。我不明白的是read()不只是移动到下一个元素,它移动到下一个TOKEN,它可以是文本,结束标记或任何XML元素。以下是未来读者的工作代码:

$xml = new XMLReader;
$xml->open('data.xml');

$xml->read(); // One read to skip the "everything" element

while ($xml->read()) {
        if ($xml->nodeType == XMLReader::ELEMENT) {
                if ($xml->name == 'url') {
                    $xml->read();
                    if ($xml->nodeType == XMLReader::TEXT) {
                       print 'got url: ' . $xml->value.PHP_EOL;
                    }
                }elseif ($xml->name == 'text') {
                    $xml->read();
                    if ($xml->nodeType == XMLReader::TEXT) {
                       print 'got text: ' . $xml->value.PHP_EOL;
                    }
                }
        }     
}