PHP чтение XML-файла с Preg_match_all - PullRequest
1 голос
/ 09 июля 2011

Я застрял на чем-то, чего не могу понять.В основном у меня есть XML-файлы, которые нужно читать, когда они передаются.Я специально ищу строки, которые включают:

bytes = "345354" Я хочу извлечь int из тега bytes и добавить их все.

Текущий фрагмент кода, который я используюделает трюк, но есть проблема.Код, который я использую в данный момент:

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-файлы больше, но я протестировал XML-файл с 2 строками, и каждая строка имеет байтовое значение, превышающее 2537792398, и он по-прежнему показывает только 2537792398 байт в качестве общей суммы.Я делаю не так?У меня лично есть ощущение, что это связано с многомерным массивом, но этот код - единственный, который сработал и смог получить данные за байты = "".Я не смог использовать какой-либо другой метод извлечения значений и сложения их всех для получения одного длинного байтового числа.

Любая помощь или указатели в правильном направлении приветствуются!

С уважением,

Том

Ответы [ 2 ]

0 голосов
/ 10 июля 2011

Я согласен, вам нужно использовать Dom вместо функций preg. XMl всегда будет содержать пользовательский контент, preg не готов к этому, кроме того, у xml уже есть свои парсеры, основная идея dom, прочитайте руководство - http://lv.php.net/manual/en/class.domdocument.php

0 голосов
/ 10 июля 2011

Похоже, ваш номер читается как строка, это происходит с числами, когда вы используете для них регулярные выражения.Вы можете использовать (int) $ num, чтобы вернуть его в число.

Однако вы никогда не должны использовать preg в xml, вы должны использовать DOMDocument (simpleXML тоже работает, но моя любимая - DOMDOcument)

Напримересли бы ваши байтовые атрибуты были на xml-узле bytestore, вы бы сделали:

$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 здесь, с поддеревьями корня дерева, запрос будетbe:

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

В любом случае, напишите мне в комментариях, если вам нужна дополнительная помощь.

...