Привет, что лучший способ подсчитать количество элементов в XML-файле? В моем случае я хочу подсчитать количество тегов XML с именем «OfferName» в теге «OfferNameList».
XML ниже содержится в переменной php $ offers
$offers = '<OfferNameList> <OfferName>...</OfferName> <OfferName>...</OfferName> <OfferName>...</OfferName> ... </OfferNameList>';
Спасибо за помощь
С DOM
вы можете использовать
$dom->getElementsByTagName('OfferName')->length;
для подсчета всех элементов OfferName . length
является атрибутом DOMNodeList
.
Чтобы подсчитать все элементы OfferName в списке OfferNameList , вы можете использовать DOMXPath::evaluate
$xpath->evaluate('count(//OfferNameList/OfferName');
Обратите внимание, что здесь несколько неточно, так как запрос XPath будет рассматривать только прямых детей. Измените свой вопрос, если вам нужны элементы OfferName, находящиеся ниже элемента OfferNameList.
Также обратите внимание, что //
будет запрашивать в любом месте документа, что может быть менее эффективным для больших документов. Если вы знаете, что элементы OfferNameList встречаются в определенной позиции только в вашем XML, используйте прямой путь.
Полный рабочий пример ( выполняется на кодовом коде ):
$xml = <<< XML <root> <NotOfferNameList> <OfferName>...</OfferName> <OfferName>...</OfferName> <OfferName>...</OfferName> </NotOfferNameList> <OfferNameList> <OfferName>...</OfferName> <OfferName>...</OfferName> <OfferName>...</OfferName> </OfferNameList>; </root> XML; $dom = new DOMDocument; $dom->loadXml($xml); // count all OfferName elements echo $dom->getElementsByTagName('OfferName')->length, PHP_EOL; // 6 // count all OfferNameList/OfferName elements $xp = new DOMXPath($dom); echo $xp->evaluate('count(//OfferNameList/OfferName)'); // 3
Вы можете использовать функцию PHP substr_count
<?php $tag_count = substr_count($offers, "<OfferName>"); ?>
Возможно, вам нужно будет извлечь содержимое тегов с помощью регулярного выражения.
Если вы являетесь автором XML-файла, вы также можете просто вставить счетчик как атрибут тега OfferNameList, например ….
Наконец, если вам нужно проанализировать XML-файл, я бы настоятельно предложил получить правильный синтаксический анализатор XML (DOM Parser будет считать внутренние теги для вас, если ваш XML не слишком велик), но вы также сможете сделать это с помощью реализация синтаксического анализа SAX.
eighter вы используете simplexml: http://www.php.net/manual/de/simplexmlelement.count.php
<?php $xml = <<<EOF <OfferNameList> <OfferName> <child/> <child/> </OfferName> <OfferName> <child/> <child/> <child/> </OfferName> </OfferNameList> EOF; $elem = new SimpleXMLElement($xml); printf("%d offers.\n", $elem->OfferNameList->count() ); ?>
или сделать это с помощью DOM
$domobj->getElementsByTagName('OfferName')->length;
Добавляем к решению, данному @Gordon (который отлично подходит для заданного вопроса), его не упоминается и для людей, которым это не очень очевидно: можно использовать evaluate
если вы хотите подсчитать имя OfferName
из некоторого XML: `
<OfferNameList> <OfferName> <child/> <child/> </OfferName> <OfferName> <child/> <child/> <child/> </OfferName> </OfferNameList> <OfferNameList> <OfferName> <child/> <child/> </OfferName> </OfferNameList>
Можно использовать
echo $xp->evaluate('count(//OfferNameList[1]/OfferName)');
считать его с FIRST OfferNameList и
echo $xp->evaluate('count(//OfferNameList[2]/OfferName)');
считать его с SECOND .
PS:
Я просто размещаю этот ответ здесь, потому что я хотел достичь чего-то вроде того, что я только что показал, и нашел этот пост в google'ing!
В то же время мы используем 1 и 2 для доступа к ПЕРВЫМ и ВТОРОМ спискам, а НЕ 0 и 1. Новички, подобные мне, могут не знать об этом.
Вы можете использовать $dom->count()
для PHP 5> = 5.3.0
Руководство PHP