gpt4 book ai didi

php - 如何在 PHP 中使用 XMLReader?

转载 作者:IT老高 更新时间:2023-10-28 11:55:31 24 4
gpt4 key购买 nike

我有以下 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 编写一个原型(prototype),看看它是否适合你。如果性能至关重要,请尝试 DOM。尽可能远离 XMLReader。请记住,您编写的代码越多,引入错误或引入性能回归的可能性就越大。

关于php - 如何在 PHP 中使用 XMLReader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1835177/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com