我有一个大的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;
}
}
}
}