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
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
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;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With