我有一个大型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文件以进一步(更容易)处理。谢谢!
更新:
想出来,在下面为未来的读者发布答案。
答案 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;
}
}
}
}