PHP使用Preg_match_all读取XML文件

PHP使用Preg_match_all读取XML文件,php,arrays,recursion,preg-match,Php,Arrays,Recursion,Preg Match,我被困在一件我无法理解的事情上。基本上,我有XML文件,需要在子提交时读取它们。我特别寻找的产品线包括: bytes=“345354”我想从bytes标记中提取int并将它们全部相加 我正在使用的当前代码确实起到了作用,但存在一个问题。我目前使用的代码是: preg_match_all('|bytes="(.+?)"|', $filecontent, $array); function arraySumRecursive($array) { $total = 0;

我被困在一件我无法理解的事情上。基本上,我有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);
现在,这段代码运行良好,但它有一个问题,一旦它读取的XML文件的字节总数超过2537792398,它将不会显示正确的字节总数,但总是在2537792398字节处停止。虽然XML文件更大,但我使用一个包含2行的XML文件进行测试,每行的字节值都大于2537792398,并且它仍然只显示2537792398字节作为总和

谁能告诉我我做错了什么?我个人有一种感觉,它与多维数组有关,但这段代码是唯一有效并成功获取字节“”数据的代码。我无法使用任何其他方法提取值并将它们全部相加,从而得出一个长字节数

任何正确方向的帮助或指点都将不胜感激

问候,


Tom

听起来你的数字像是被读取为字符串,当你在数字上使用正则表达式时,就会发生这种情况。可以使用(int)$num将其强制恢复为数字

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

例如,如果字节属性位于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');
}
如果字节属性位于weholdbytes here节点内的字节持有者节点中,则查询将为树根的子树:

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

无论如何,如果您需要更多帮助,请在评论中告诉我。

我同意,您需要使用Dom代替preg函数。
XMl将始终包含自定义内容,preg还没有准备好,此外,XMl已经有了它的解析器,这是dom的主要思想,请阅读手册-

您每次都能打印出
$num
吗?PHP的整数可以保存非常大的数字,没有任何问题:您的方式可以工作,谢谢。然而,现在我发现它使用了大量内存来执行这样的功能,这很奇怪,因为使用preg_match_all时,它似乎轻而易举。有没有关于如何加快速度的想法?我正在寻找的xml文件将有5万+千行和almos,所有这些文件都将有一个字节标记在其中。这个想法不是要找到谁同意人们的答案,只是对web开发问题的答案。你不应该发布这个答案,而应该对我的答案进行投票,并在评论中添加到php.net的链接。我很抱歉我投了反对票,这太苛刻了,但我不会取消的。