【问题标题】:Only select nodes without a namespace/prefix in PHP DOM?仅在 PHP DOM 中选择没有命名空间/前缀的节点?
【发布时间】:2012-06-09 00:51:47
【问题描述】:

我正在尝试使用 PHP 中的 DOM 读取一些 RSS 提要,如下所示:

    <channel>
        <atom:link href='' rel='self' type='application/rss+xml' />
        <title>TechStuff</title>
        <link>http://www.howstuffworks.com</link>

为了获取链接 (&lt;link&gt;&lt;/link&gt;),我使用了这段代码:

    $doc->getElementsByTagName('link')->item(0);

它适用于我尝试过的所有其他 RSS 提要。但是这个把&lt;atom:link&gt;放在&lt;link&gt;之前,也就是说它抢了&lt;atom:link&gt;

那么如何只选择没有命名空间的节点呢?

【问题讨论】:

    标签: php xml dom namespaces


    【解决方案1】:

    这里是 DOMXPath 示例:

    $xpath = new DOMXpath($doc);
    $linkPath = $xpath->query("/rss/channel/link");
    $link = $linkPath->item(0)->nodeValue;
    

    在类似的 XML 层次结构上,它对我有用。

    【讨论】:

      【解决方案2】:

      您可以通过检查-&gt;prefix-&gt;namespaceURI 来判断一个节点是否有命名空间:

      foreach ($doc->getElementsByTagName('link') as $link) {
          if (strlen($link->prefix)) {
              continue;
          }
          // $link does not have prefix
      }
      

      【讨论】:

        【解决方案3】:

        设法通过使用DOMXPathXPath syntax 来解决它。

        【讨论】:

        • 如果你添加一个小例子就好了(只是一个示例性的 xpath,xpath 函数名称应该自己说话)
        猜你喜欢
        • 1970-01-01
        • 2015-04-14
        • 2011-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多