如何使用XMLReader提取元素


How to extract elements with XMLReader

我有一个大的XML文件(4GB),我正在对其进行解析并导入到数据库中。我一直在使用XMLReader,但似乎无法使其发挥作用,而且PHP文档中没有太多可供使用的示例。

我的目标是从我正在使用的XML文件的以下(简化)版本中提取"url"answers"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"answers"text"并忽略其余部分的伪代码是什么?我计划将这些对输出到CSV文件中,以便进一步(更容易)处理。非常感谢。

更新:

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

我终于让它工作起来了。我不明白的是,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;
                    }
                }
        }     
}