嗨,计算XML文件中元素数量的最佳方法是什么?在我的情况下,我想在标签“OfferNameList”中计算名称为“OfferName”的XML标签的数量。
以下XML包含在php变量$ offers
中$offers = '<OfferNameList>
<OfferName>...</OfferName>
<OfferName>...</OfferName>
<OfferName>...</OfferName>
...
</OfferNameList>';
感谢您的帮助
答案 0 :(得分:23)
使用DOM
,您可以使用
$dom->getElementsByTagName('OfferName')->length;
仅计算 所有OfferName元素 。 length
is an attribute of DOMNodeList
.
要计算 OfferNameList 中的所有OfferName元素,您可以使用DOMXPath::evaluate
$xpath->evaluate('count(//OfferNameList/OfferName');
请注意,中的在某种程度上是不准确的,因为XPath查询只会考虑直接子项。如果您在OfferNameList元素下方的任何位置需要OfferName元素,请调整您的问题。
另请注意,//
将查询文档中的任何位置,这对于大型文档可能效率较低。如果您知道OfferNameList元素仅出现在XML中的某个位置,请使用直接路径。
完整的工作示例(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
答案 1 :(得分:4)
你使用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;
答案 2 :(得分:3)
您可以使用PHP函数substr_count
<?php
$tag_count = substr_count($offers, "<OfferName>");
?>
您可能需要先使用正则表达式提取标记的内容。
如果您是XML文件的作者,您还可以简单地将计数作为OfferNameList标记的属性嵌入,例如....
最后,如果你需要解析XML文件,我强烈建议你得到一个合适的XML解析器(DOM Parser将为你计算内部标签,假设你的XML不是太大)但你也可以使用SAX解析器实现来完成它。
答案 3 :(得分:1)
添加@Gordon给出的解决方案(对于提出的问题非常好),没有提及,对于那些不太明显的人:
如果您想从某些XML计算evaluate
,则可以使用OfferName
:
`
<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 计算。
P.S。:
我只是在这里发布这个答案,因为我想实现像我刚刚展示的那样,我发现谷歌上的这篇文章!
Seondly,我们使用1和2来访问 FIRST 和 SECOND 列表以及 NOT 0和1.像我这样的新手可能不知道这个。
答案 4 :(得分:0)
您可以将$dom->count()
用于PHP 5&gt; = 5.3.0