Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

php count xml elements

Tags:

php

xml

Hi what is the best way to count the number of elements in a XML file? In my case I want to count the number of XML tags with the name "OfferName" within the tag "OfferNameList".

The XML below is contained in a php variable $offers

$offers = '<OfferNameList>
  <OfferName>...</OfferName>
  <OfferName>...</OfferName>
  <OfferName>...</OfferName>
  ...
</OfferNameList>';

Thanks for the help

like image 599
Martin Avatar asked Dec 08 '10 10:12

Martin


2 Answers

With DOM you can either use

$dom->getElementsByTagName('OfferName')->length;

to count all OfferName elements only. length is an attribute of DOMNodeList.

To count all OfferName elements within an OfferNameList, you can use DOMXPath::evaluate

$xpath->evaluate('count(//OfferNameList/OfferName');

Note that within is somewhat inaccurate here as the XPath query will only consider direct children. Please adjust your question if you need OfferName elements anywhere below a OfferNameList element.

Also note that // will query anywhere in the document, which might be less efficient for large documents. If you know OfferNameList elements occur at a certain position in your XML only, use a direct path.


Full working example (run on codepad):

$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
like image 194
Gordon Avatar answered Sep 22 '22 03:09

Gordon


eighter you use 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() );

?>

or do it with DOM

 $domobj->getElementsByTagName('OfferName')->length;
like image 30
endo.anaconda Avatar answered Sep 22 '22 03:09

endo.anaconda