【问题标题】:How to access multiple similar tag in XML using PHP如何使用 PHP 访问 XML 中的多个相似标签
【发布时间】:2011-10-20 11:23:26
【问题描述】:

我有一个如下的 XML。

    <statuses type="array">
    <status>
    <created_at>Thu Oct 20 09:49:46 +0000 2011</created_at>
    <text>@pkprasad82  Hello</text>
    <entities>
    <user_mentions>
    <user_mention end="11" start="0">
    <id>133809164</id>
    <screen_name>pkpras</screen_name>
    <name>prav</name>
    </user_mention>
    </user_mentions>
    <urls/>
    <hashtags/>
    </entities>
    </status>
    <status>
    <created_at>Thu Oct 20 09:49:46 +0000 2011</created_at>
    <text>hello  Hello</text>
    <entities>
    <user_mentions>
    <user_mention end="11" start="0">
    <id>123456789</id>
    <screen_name>pkpras</screen_name>
    <name>pravin</name>
    </user_mention>
    </user_mentions>
    <urls/>
    <hashtags/>
    </entities>
    </status>
    <statuses>

我只想访问 php 中两个“status”标签的“id”标签。我不想要任何其他标签。 例如 编号=133809164 id=123456789

【问题讨论】:

    标签: php xml xpath


    【解决方案1】:

    您可以使用XPath 检索此信息。作为参数传递给链接方法的位置路径是:

    /statuses/status//id
    

    【讨论】:

    • @Peter 感谢您的无私和诚实。
    【解决方案2】:

    考虑像这样使用SimpleXML

    <?php
    
    // @Himanshu - Notice correction to final closing tag.
    
    $xmlstr = '
    <statuses type="array">
      <status>
        <created_at>Thu Oct 20 09:49:46 +0000 2011</created_at>
        <text>@pkprasad82  Hello</text>
        <entities>
          <user_mentions>
            <user_mention end="11" start="0">
              <id>133809164</id>
              <screen_name>pkpras</screen_name>
              <name>prav</name>
            </user_mention>
          </user_mentions>
          <urls/>
          <hashtags/>
        </entities>
      </status>
      <status>
        <created_at>Thu Oct 20 09:49:46 +0000 2011</created_at>
        <text>hello  Hello</text>
        <entities>
          <user_mentions>
            <user_mention end="11" start="0">
              <id>123456789</id>
              <screen_name>pkpras</screen_name>
              <name>pravin</name>
            </user_mention>
          </user_mentions>
          <urls/>
          <hashtags/>
        </entities>
      </status>
    </statuses>';
    
    $mydata = new SimpleXMLElement($xmlstr);
    
    /* For each <user_mention> node, we echo a separate <id>. */
    foreach ($mydata as $status) {
        foreach ($status->entities->user_mentions as $user_mention) {
            echo $user_mention->user_mention->id, PHP_EOL;
        }
    }
    ?>
    

    在这种情况下产生的输出是:

    133809164
    123456789
    

    【讨论】:

    • 当您可以使用位置路径检索所需内容时,我不明白为什么需要双重 foreach。无论如何,这也是一个解决方案。
    • @AurelioDeRosa:你是对的 - SimpleXML 包总是使用 DOM 解析器,因此使用我的回答中描述的方法没有性能优势。
    猜你喜欢
    • 2020-07-22
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多