PHP XML 解析

Posted

技术标签:

【中文标题】PHP XML 解析【英文标题】:PHP XML Parsing 【发布时间】:2010-10-05 12:12:39 【问题描述】:

php 中解析 XML 文件的最佳方法是什么?

第一 使用 DOM 对象

//code
$dom = new DOMDocument();
$dom->load("xml.xml");

$root = $dom->getElementsByTagName("tag");
foreach($root as $tag)

$subChild = $root->getElementsByTagName("child");

// extract values and loop again if needed

第二 使用 simplexml_load 方法

// code
$xml = simplexml_load_string("xml.xml");
$root = $xml->root;
foreach($root as $tag)

$subChild = $tag->child;
// extract values and loop again if needed

注意: 这是我知道的两个。如果有更多的填写。

想知道哪种方法最适合解析大型 XML 文件,以及哪种方法最快,无论该方法需要以何种方式实现

大小从 500KB 到 2MB 不等。如果可能的话,解析器应该能够在最短的时间内解析大小文件和大文件,并使用良好的内存。

【问题讨论】:

当我们说“巨大”时,我们在谈论多大?兆字节值? 【参考方案1】:

为了易于使用,我更喜欢 simplexml_load_string。如果两者使用不同的解析文件的方法,处理速度很可能取决于 XML 文件的格式 - 在您自己的文件上尝试一下,看看哪个更适合您。

【讨论】:

【参考方案2】:

这取决于您传递的文档,但 XMLReader 通常比 simplexml 和 DOM (http://blog.liip.ch/archive/2004/05/10/processing_large_xml_documents_with_php.html) 都快。就个人而言,虽然我从未使用过 XMLReader,但通常根据我是否需要编辑它来决定使用哪个:

simplexml 如果我只是在阅读文档 如果我正在修改 DOM 并将其保存回来,则为 DOM

您还可以在 simplexml 和 DOM 之间转换对象。

【讨论】:

【参考方案3】:

现在我开发时,所有 XML 都由 PHP 中的 simpleXML 处理。它很容易扩展,并在需要时覆盖方法。

【讨论】:

simpleXML 并不真正适合扩展。您不能覆盖构造函数,也不能将属性添加到子类,因为它们被视为新节点。最好使用组合而不是继承,即“有一个”simpleXML 而不是“是一个”simpleXML【参考方案4】:

如果您正在处理 巨大 文件,请不要解析它们。请改用XSLT。这将为您节省大量内存和处理时间。

【讨论】:

【参考方案5】:

我已经开始使用 XMLReader 来解析 XML 文件。在进行了一些谷歌搜索后,发现它是解析 XML 文件的最佳方式,因为它不会将整个 XML 文件加载到内存中。假设假设我的 XML 文件为 5 MB,而使用 XMLReader 解析它时,我的 5MB 内存不会被浪费。

//usage
$xml = new XMLReader();
$xml->XML($xmlString);
while($xml->read)

if($xml->localName == 'Something') // check if tag name equals something

//do something


使用 XML Reader,我们可以找到当前标签是开始标签还是结束标签,并根据需要进行操作。

【讨论】:

以上是关于PHP XML 解析的主要内容,如果未能解决你的问题,请参考以下文章

php解析xml,并将xml转换为层级数组

php如何解析多级xml报文?

PHP XML Expat 解析器

php 如何解析xml格式字符串

PHP XML 解析

XML 解析 - PHP 编码