【问题标题】:php count xml elementsphp计数xml元素
【发布时间】:2011-05-22 03:36:19
【问题描述】:

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

下面的 XML 包含在 php 变量 $offers 中

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

感谢您的帮助

【问题讨论】:

    标签: php xml


    【解决方案1】:

    DOM 可以使用

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

    只计算所有 OfferName 元素length is an attribute of DOMNodeList.

    要计算OfferNameList 中的所有OfferName 元素,您可以使用DOMXPath::evaluate

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

    请注意,within 在这里有些不准确,因为 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
    

    【讨论】:

    • 感谢代码示例!请您将其发布在您的问题中,以便将来的读者可以在上述链接失效的情况下看到这一点。
    • 谢谢!很好的回答,非常感谢!
    • 我仍在寻找问题的答案,因为我的问题已经结束,并且天数与此相同。 stackoverflow.com/questions/12234985/php-xml-count-numbers我想从数组中计算“字符串”,但只是元素。能否请你帮忙。谢谢
    【解决方案2】:

    你使用 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;
    

    【讨论】:

    • 这假设 OfferNameList 只有 OfferName 子级,这正是我不使用 SimpleXml 的原因。它迫使您对标记做出假设。
    【解决方案3】:

    可以使用PHP函数substr_count

    <?php
      $tag_count = substr_count($offers, "<OfferName>");
    ?>
    

    您可能需要先使用正则表达式提取标签的内容。

    如果您是 XML 文件的作者,您也可以简单地将计数嵌入为 OfferNameList 标记的属性,例如 ....

    最后,如果您需要解析 XML 文件,我强烈建议您使用合适的 XML 解析器(DOM Parser 会为您计算内部标签,假设您的 XML 不是太大),但您也可以使用 SAX 解析器实现。

    【讨论】:

      【解决方案4】:

      添加到@Gordon 给出的解决方案(对于提出的问题非常有效),它没有被提及并且对于那些不是很明显的人: 如果您想从一些 XML 中计算 OfferName,可以使用 evaluate,例如: `

      <OfferNameList>
       <OfferName>
        <child/>
        <child/>
       </OfferName>
       <OfferName>
        <child/>
        <child/>
        <child/>
       </OfferName>
      </OfferNameList>
      
      <OfferNameList>
       <OfferName>
        <child/>
        <child/>
       </OfferName>
      </OfferNameList>
      

      可以使用

      echo $xp-&gt;evaluate('count(//OfferNameList[1]/OfferName)');FIRST OfferNameList 和

      算起

      echo $xp-&gt;evaluate('count(//OfferNameList[2]/OfferName)');SECOND 开始计算。

      PS:

      我只是在这里发布这个答案,因为我想实现我刚才展示的东西,我在 google'ing 上找到了这篇文章!

      其次,我们使用 1 和 2 访问 FIRSTSECOND 列表和 NOT 0 和 1。像我这样的新手可能不知道这。

      【讨论】:

        【解决方案5】:

        对于 PHP 5 >= 5.3.0,您可以使用 $dom-&gt;count()

        PHP Manual

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-22
          • 1970-01-01
          相关资源
          最近更新 更多