当前位置: 首页 > 面试题库 >

如何在PHP中使用XMLReader?

甘西岭
2023-03-14
问题内容

我有以下XML文件,该文件相当大,我无法获取simplexml来打开和读取该文件,因此我正在尝试XMLReader,但在php中没有成功

<?xml version="1.0" encoding="ISO-8859-1"?>
<products>
    <last_updated>2009-11-30 13:52:40</last_updated>
    <product>
        <element_1>foo</element_1>
        <element_2>foo</element_2>
        <element_3>foo</element_3>
        <element_4>foo</element_4>
    </product>
    <product>
        <element_1>bar</element_1>
        <element_2>bar</element_2>
        <element_3>bar</element_3>
        <element_4>bar</element_4>
    </product>
</products>

不幸的是,我还没有找到关于PHP的很好的教程,很想看看我如何才能将每个元素的内容存储数据库中。


问题答案:

这完全取决于工作单元的大小,但是我想您正在尝试<product/>连续对待每个节点。

为此,最简单的方法是使用XMLReader到达每个节点,然后使用SimpleXML访问它们。这样,您可以将内存使用率保持在较低水平,因为您一次要处理一个节点,并且仍然利用SimpleXML的易用性。例如:

$z = new XMLReader;
$z->open('data.xml');

$doc = new DOMDocument;

// move to the first <product /> node
while ($z->read() && $z->name !== 'product');

// now that we're at the right depth, hop to the next <product/> until the end of the tree
while ($z->name === 'product')
{
    // either one should work
    //$node = new SimpleXMLElement($z->readOuterXML());
    $node = simplexml_import_dom($doc->importNode($z->expand(), true));

    // now you can use $node without going insane about parsing
    var_dump($node->element_1);

    // go to next <product />
    $z->next('product');
}

快速概述不同方法的优缺点:

仅XMLReader

  • 优点:速度快,占用内存少

  • 缺点:很难编写和调试,需要大量的用户区代码才能做有用的事情。用户域代码很慢,容易出错。另外,它为您提供了更多的代码行来维护

XMLReader + SimpleXML

  • 优点:不需要使用太多内存(仅用于处理一个节点所需的内存),顾名思义,SimpleXML确实非常易于使用。

  • 缺点:为每个节点创建SimpleXMLElement对象不是很快。您真的必须对其进行基准测试,以了解它是否对您造成问题。不过,即使是一台普通的机器,也能够每秒处理一千个节点。

XMLReader + DOM

  • 优点:使用的内存与SimpleXML差不多,并且[XMLReader ::expand()比创建新的SimpleXMLElement更快。我希望可以使用,simplexml_import_dom()但在这种情况下似乎不起作用

  • 缺点:DOM很烦人。它位于XMLReader和SimpleXML之间。不像XMLReader那样复杂和尴尬,但是距离使用SimpleXML尚需时日。

我的建议:使用SimpleXML编写原型,看看它是否适合您。如果性能至关重要,请尝试使用DOM。尽可能远离XMLReader。请记住,您编写的代码越多,引入错误或引入性能退化的可能性就越大。



 类似资料:
  • 问题内容: 我在用PHP编码。我有以下mySQL表: 我正在尝试在PHP中使用mysqli_query函数来描述表。 这是我的代码: 该文档说, 对于成功的SELECT,SHOW,DESCRIBE或EXPLAIN查询,mysqli_query()将返回 mysqli_result 对象。 但是从那里我不知道如何打印,以便显示查询结果。如果可能的话,我想打印$ result,使其看起来像: 我的另一

  • 问题内容: 我想使用Selenium来自动化一些Web任务(不用于测试)。我认为我已经安装了Selenium RC Server,但是由于无法在PHP中找到客户端驱动程序,因此无法编写“测试脚本”(请参阅​​: http //seleniumhq.org/download/)。 我有办法在PHP中使用Selenium吗?这似乎表明我需要PHPUnit http://www.phpunit.de/m

  • 问题内容: 我尚未找到一个很好的示例,说明如何使用php RegexIterator递归遍历目录。 最终结果将是我想指定一个目录并在其中找到具有给定扩展名的所有文件。例如仅说html / php扩展名。此外,我想过滤掉.Trash-0,.Trash-500等类型的文件夹。 到目前为止,是我得到的结果是:致命错误:消息为’RecursiveDirectoryIterator :: __ constr

  • 问题内容: 由于性能问题, 我尝试避免执行Count( )。 (即 从用户中 选择COUNT( )) 如果我在phpMyAdmin中运行以下命令,则可以: 它将返回行数。即用户数量。 但是,如果我在PHP中运行,则无法执行以下操作: 似乎PHP不希望传入两个查询。那么,我该怎么做呢? 问题答案: 仅在使用子句的情况下才有用,但仍想知道不使用会发现多少行。 考虑一下它是如何工作的: 您正在强制数据库

  • 问题内容: 因此,在我正在编写的此程序中,我实际上是使用表单从用户那里获取SQL查询。然后,我继续在数据库上运行该查询。 我知道不要“信任”用户输入,因此我想对输入进行清理。我正在尝试使用,但未能成功使用。 输入以下内容,这就是我要尝试的内容: 这总是给我 “输入无效!” 错误。 当我取出零件并仅对查询运行时, “输入无效” 不输出信息。相反,当我这样做时: 它不输出 “输入无效”。 但是,我需要

  • 问题内容: 我使用PHP显示来自MySQL的数据。这是我的css语句: 它们用于显示表,表头,表日期。我是php CSS的新手,所以我只是想知道如何在php中使用上述CSS样式显示代码: 问题答案: 级联样式表(CSS)是一种样式表语言,用于描述以标记语言编写的文档的表示语义(外观和格式)。 : CSS不是一种编程语言,并且没有服务器端语言(如PHP)随附的工具。但是,我们可以使用服务器端语言来生