【问题标题】:PHP XML ParsingPHP XML 解析
【发布时间】: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 不等。如果可能的话,解析器应该能够在最短的时间内解析大小文件和大文件,并使用良好的内存。

【问题讨论】:

  • 当我们说“巨大”时,我们在谈论多大?兆字节值?

标签: php xml parsing simplexml domdocument


【解决方案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,我们可以找到当前标签是开始标签还是结束标签,并根据需要进行操作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多