使用php从(巨大的)xml文件中提取数据

时间:2016-05-23 11:43:30

标签: php xml xpath

我有一个.xml文件(原始版本超过7000行,但是为了测试我一直使用一行只有3行,如果大小是我的问题,但事实并非如此),我会喜欢提取数据。然而,作为一个自动生成的东西,它并不是非常漂亮,观察:

<ROW MODID="182" RECORDID="561">
<COL>
<DATA>
</DATA>
</COL>
<COL>
<DATA>
6 quai St Pierre</DATA>
</COL>
<COL>
<DATA>
</DATA>
</COL>
<COL>
<DATA>
Monsieur</DATA>
</COL>
<COL>
等等...... 我已经设计了我需要在Xacobeo上运行的请求,但我似乎无法使用php。我尝试过多种变体,最后一种变体如下:

$xmldoc = new DOMDocument();
$xmldoc->load('hellashort.xml');
$xpathvar = new Domxpath($xmldoc);
$queryResult = $xpathvar->query('//COL');
foreach($queryResult as $result){
    echo $result->textContent;
}

我尝试使用更美观的文件来使用此代码并且它有效,所以如何才能使用此文件? 所有建议都赞赏。 感谢

更新 我检查了短文件中的错误并意识到我没有关闭一个元素,所以一个工作,但是长文件根据在线检查器没有包含错误但仍然不起作用。

更新2 long文件现在适用于请求/,但只要它们变得更复杂就返回任何内容,即://ROW/COL[position()=39]/DATA在Xacobeo中返回正确的结果。 .xml文件是否可能太大而无法以这种方式处理? (这个文件约为11.2 Mo)

更新3 - 已修复 所以我改变了我的态度并最终以这种方式做到了:

$file=file_get_contents("go.xml");
$xml=simplexml_load_string($file);
$elements=$xml->path('//ROW/COL[position()=1]/DATA');

我知道为什么它被称为simpleXML,感谢所有的帮助,但

2 个答案:

答案 0 :(得分:0)

首先确保您的服务器设置为显示所有可用错误。 作为变体,将此代码段放在脚本的最开头。

ini_set('display_startup_errors',1);
ini_set('display_errors',1);
error_reporting(E_ALL | E_STRICT);

然后你可以分享错误信息吗?

答案 1 :(得分:0)

确保您的文档只有一个根元素,即包含所有<ROW>元素的元素:

<DOCUMENT>
<ROW MODID="182" RECORDID="561">
<COL>
<DATA>
</DATA>
</COL>
<COL>
<DATA>
6 quai St Pierre</DATA>
</COL>
<COL>
<DATA>
<!-- ... -->
</DOCUMENT>

如果你有多个没有root的行,那么它不是一个好的XML文件,它会失败:

<ROW MODID="182" RECORDID="561">
<COL>
<DATA>
</DATA>
</COL>
<COL>
<!-- ... -->
</ROW>
<ROW MODID="183" RECORDID="562">
<!-- ... -->
</ROW>