在PHP中获取单个XML元素的最快方法是什么?

时间:2017-01-02 23:05:58

标签: php xml parsing indexing

我想要一种索引(快速且有效)的方式让PHP跳过并获得单个XML元素。就像在SQL中,您使用WHERE语句从索引列中获取单行一样。

SimpleXML解析器下载整个XML文件,而XMLReader 遍历整个文件,只是为了获得所需的单个元素。那些花了很多时间......

那么最快的黑客(或解析器程序)直接跳过 到第37个<item> 没有通过第1-36项

是什么? >

我的偏好

如果我必须使用下面的可选num="37"属性作为人工索引,那么我会,但我宁愿删除它,而是让程序神奇地找出哪个<item>是第37位。

这是我的代码:

XML

<answers>
    <item num="1"> Lorem </item>
    <item num="2"> ipsum </item>
    <item num="3"> dolor </item>
    .
    .
    .
    etc.
</answers>

PHP

$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;

1 个答案:

答案 0 :(得分:0)

您可以使用XPath以高效的方式解析XML文档。

DomCrawler

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