php计数xml元素

时间:2010-12-08 10:31:28

标签: php xml

嗨,计算XML文件中元素数量的最佳方法是什么?在我的情况下,我想在标签“OfferNameList”中计算名称为“OfferName”的XML标签的数量。

以下XML包含在php变量$ offers

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

感谢您的帮助

5 个答案:

答案 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

PHP Manual