0

我有一个大型 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 文件以进行进一步(更容易)处理。谢谢!

更新:

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

4

1 回答 1

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;
                    }
                }
        }     
}
于 2013-07-30T03:28:54.693 回答