【问题标题】:PHP Reading XML File with Preg_match_allPHP 使用 Preg_match_all 读取 XML 文件
【发布时间】:2011-07-09 18:28:53
【问题描述】:

我被困在我无法理解的事情上。基本上我有提交时需要读取的 XML 文件。我正在寻找包含以下内容的行:

bytes="345354" 我想从 bytes 标签中提取 int 并将它们全部加起来。

我正在使用的当前代码可以解决问题,但存在问题。我目前使用的代码是:

preg_match_all('|bytes="(.+?)"|', $filecontent, $array);

function arraySumRecursive($array)
    {
        $total = 0;
        foreach(new recursiveIteratorIterator( new recursiveArrayIterator($array)) as $num)
        {
            $total += $num;
        }
        return $total;
    }
$size = arraySumRecursive($array);

现在这段代码运行良好,但是一旦读取一个字节加起来超过 2537792398 的 XML 文件就会出现问题,它不会显示正确的字节总和,但总是停在 2537792398 字节。当然 XML 文件更大,但我用 2 行的 XML 文件进行了测试,每行的字节值大于 2537792398,但总和仍然只显示 2537792398 字节。

谁能告诉我我做错了什么?我个人感觉它与多维数组有关,但此代码是唯一有效并设法获取 bytes="" 数据的代码。我无法使用任何其他方法来提取值并将它们全部加起来以得出一个长字节数。

感谢任何帮助或正确方向的指示!

问候,

汤姆

【问题讨论】:

标签: php arrays recursion preg-match


【解决方案1】:

听起来您的号码被读取为字符串,当您在数字上使用正则表达式时会发生这种情况。您可以使用 (int)$num 将其强制转换为数字。

但是,你不应该在 xml 上使用 preg,你应该使用 DOMDocument(simpleXML 也可以,但我最喜欢的是 DOMDOcument)

例如。如果您的 bytes 属性位于 bytestore xml 节点上,您会这样做:

$bytes = (int)0;
$xml = new DOMDocument();
$xml->load($variableholdingxml); //can be url of xml file also
foreach($xml->getElementsByTagName('bytestore') as $holder)
{
 $bytes = $bytes + (int)$holder->getAttribute('bytes');
}
return $bytes;

为回应评论而添加 解析大文件通常确实需要一些时间,虽然我不是 DOMDocument 方法速度方面的专家,但 xpath 查询可能会稍微快一些。

$xml = new DOMDocument();
$xml->load($variableholdingxml); //can be url of xml file also
$xpath = new DOMXPath();
$q = "//root/parentnode/childnode/byteholdnode/";
$nodes = $xpath->query($q);
foreach($nodes as $node)
{
    $bytes = $bytes + (int)$node->getAttribute('bytes');
}

如果您的 bytes 属性位于 weholdbytes here 节点内的 byteholder 节点中,并且带有树根的子树,则查询将是:

$q = "//root/subtrees/weholdbytes/byteholder/"; /* yes that was supposed to make it clearer.*/

无论如何,如果您需要更多帮助,请在 cmets 中给我留言。

【讨论】:

  • 你的方法行得通,谢谢。但是现在我发现它使用大量内存来执行这样的功能,这很奇怪,因为使用 preg_match_all 时似乎轻而易举。关于如何加快速度的任何想法?我正在寻找将有 50+ 千行的 xml 文件,并且所有这些文件中都会有一个字节标记。
【解决方案2】:

我同意,您需要使用 Dom 代替 preg 函数。 XMl 总是会包含自定义内容,preg 还没有准备好,此外,xml 已经有它的解析器,主要的 dom 思想,阅读手册 - http://lv.php.net/manual/en/class.domdocument.php

【讨论】:

  • 我们的想法不是找到同意人们答案的人,而是简单地回答 Web 开发问题。而不是发布这个答案,你应该投票赞成我的并在 cmets 中添加到 php.net 的链接。我很抱歉投了反对票,这很苛刻,但它不会让我取消它。
猜你喜欢
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 2012-07-21
相关资源
最近更新 更多