【问题标题】:xpath not return valuesxpath 不返回值
【发布时间】:2011-09-05 22:36:12
【问题描述】:

当我使用以下代码使用var_dump 时,我能够使用xpath 提取必要的信息。当我尝试添加一个 foreach 循环以返回所有 ["href"] 值时,我得到一个空白页,有什么想法我搞砸了吗?

$dom = new DOMDocument();
@$dom->loadHTML($source);
$xml = simplexml_import_dom($dom);
$rss = $xml->xpath("/html/body//a[@class='highzoom1']");

$links = $rss->href;

foreach ($links as $link){ 
    echo $link; 
    }

这是信息数组。

array(96) {
  [0]=>
  object(SimpleXMLElement)#3 (2) {
    ["@attributes"]=>
    array(2) {
      ["href"]=>
      string(49) "/p/18351/test1.html"
      ["class"]=>
      string(10) "highzoom1"
    }
    [0]=>
    string(36) ""test1"
  }
  [1]=>
  object(SimpleXMLElement)#4 (2) {
    ["@attributes"]=>
    array(2) {
      ["href"]=>
      string(43) "/p/18351/test2.html"
      ["class"]=>
      string(10) "highzoom1"
    }
    [0]=>
    string(30) ""test2"
  }
  [2]=>
  object(SimpleXMLElement)#5 (2) {
    ["@attributes"]=>
    array(2) {
      ["href"]=>
      string(48) "/p/18351/test3.html"
      ["class"]=>
      string(10) "highzoom1"
    }
    [0]=>
    string(35) ""test3"
  }

【问题讨论】:

  • 能否请您在原始XML的内容中发布以供参考?
  • 好问题,+1。请参阅我的答案以获得简短的单行 XPath 解决方案:)

标签: php xpath foreach simplexml


【解决方案1】:

代替

$rss = $xml->xpath("/html/body//a[@class='highzoom1']");

使用

$hrefs = $xml->xpath("/html/body//a[@class='highzoom1']/@href");

您使用的原始 XPath 表达式(上面的第一个)选择 XML 文档中的任何 a 元素,其 class 属性的值是 'highzoom1' 并且(a 元素)是body,它是 XML 文档中顶部元素(名为 html)的子元素。

但是,您希望选择这些 a 元素的 href 属性,而不是 a 元素本身。

上面的第二个 XPath 表达式恰好选择了这些 a 元素的 href 属性

【讨论】:

  • 当我使用 var_dump($hrefs);时,你的例子给了我array(0) { }
  • @sarsar:如果是这样,这意味着 Simple XML 不是兼容的 XPath 引擎。我可以在 XPath 方面为您提供帮助,但不能在 XPath 的不兼容实现方面为您提供帮助。请重新标记并删除“xpath”标签并添加“simplexml 标签。
  • @sarsar:很高兴听到这个消息。 :)
【解决方案2】:
$links = $rss->href;

永远不会起作用,因为 $rss 是一个 DOMNodeList 对象,并且没有 href 属性。相反,您应该这样做:

$rss = $xml->xpath("/html/body//a[@class='highzoom1']");

foreach($rss as $link) {
    echo $link->href;
}

或者你可以直接将 $rss 当作一个数组来寻址:

echo $rss[5]->href; // echo out the href of the 6th link found.

【讨论】:

    猜你喜欢
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多