我想要一种索引(快速且有效)的方式让PHP跳过并获得单个XML元素。就像在SQL中,您使用WHERE
语句从索引列中获取单行一样。
SimpleXML解析器下载整个XML文件,而XMLReader 遍历整个文件,只是为了获得所需的单个元素。那些花了很多时间......
那么最快的黑客(或解析器程序)直接跳过 到第37个<item>
没有通过第1-36项
如果我必须使用下面的可选num="37"
属性作为人工索引,那么我会,但我宁愿删除它,而是让程序神奇地找出哪个<item>
是第37位。
这是我的代码:
<answers>
<item num="1"> Lorem </item>
<item num="2"> ipsum </item>
<item num="3"> dolor </item>
.
.
.
etc.
</answers>
$xml = new XMLReader();
$xml->open("file.xml") or die("Error: Cannot create object");
while($xml->read()) {
if ($xml->nodeType == XMLREADER::ELEMENT && $xml->localName == "item") {
$xml->read();
echo $xml->value;
};
};
return;
答案 0 :(得分:0)
您可以使用XPath以高效的方式解析XML文档。
Symfony的DomCrawler组件具有使用XPath和CSS解析HTML / XML文档的API。看看:
<?php
require 'vendor/autoload.php';
use Symfony\Component\DomCrawler\Crawler;
$xml = <<<XML
<root xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org">
<answers>
<item num="1">dolor1</item>
<item num="2">dolor2</item>
<item num="3">dolor3</item>
<item num="4">dolor4</item>
<item num="5">dolor5</item>
<item num="6">dolor6</item>
<item num="7">dolor7</item>
<item num="8">dolor8</item>
<item num="9">dolor9</item>
<item num="10">dolor10</item>
<item num="11">dolor11</item>
<item num="12">dolor12</item>
<item num="13">dolor13</item>
<item num="14">dolor14</item>
</answers>
</root>
XML;
$crawler = new Crawler($xml);
$target = $crawler->filterXPath('//root/answers/item[@num="13"]');
var_dump($target->text());
// Outputs: dolor13
您可能已经知道,在使用Crawler
课程之前,您需要通过Composer安装该软件包,并在代码中包含自动加载器。
composer require symfony/dom-crawler
或者,如果您不想使用Composer as you stated,可以使用Git手动安装(或者您可以download a zipball代替):
cd my/project
mkdir -p vendor/symfony
git clone https://github.com/symfony/dom-crawler vendor/symfony/dom-crawler
无论哪种方式,你仍然需要PSR-4 autoloader(该作曲家开箱即用)。引用DomCrawler文档:
使用官方Git存储库(https://github.com/symfony/dom-crawler)。 然后,要求vendor / autoload.php文件启用Composer [或任何其他PSR-4自动加载器]提供的自动加载机制。否则,您的应用程序将无法找到此Symfony组件的类。
因此,请查看Example Implementations of PSR-4并为您的项目创建自动加载器。您可能希望查看可为您的项目生成名称空间感知自动加载器的Symfony's ClassLoader
组件或phpab
。
但我强烈建议你研究一下Composer。它不是你想象的那样。它将改变您作为开发人员的日常生活。
这是一个非常小的XML文档要解析,所以这些基准测试并不是真的可靠,但无论如何:
$ time php xmlparse.php
string(7) "dolor13"
php xmlparse.php 0.06s user 0.09s system 55% cpu 0.278 total
$ time php xmlparse.php
string(7) "dolor13"
php xmlparse.php 0.06s user 0.08s system 60% cpu 0.239 total
$ time php xmlparse.php
string(7) "dolor13"
php xmlparse.php 0.06s user 0.08s system 55% cpu 0.257 total