php DOM getAttribute

时间:2013-01-28 21:51:23

标签: php dom html-parsing domdocument getattribute

好吧,所以我在这里有一个奇怪的案例我无法理解。

我想在网站上解析一个列表。 HTML看起来有点像这样:

<!-- ... -->
<ul id="foo">
    <li data-text="item 1">Blabla</li>
    <li data-text="item 2">Blabla</li>
    <li data-text="item 3">Blabla</li>
    <li data-text="item 4">Blabla</li>
</ul>
<!-- ... -->

现在我要抓住所有列表项。我使用DOMDocument类。到目前为止,这很好:

$dom = new DOMDocument();

if (!$dom->loadHTML($html)) {
    die ('Could not parse...');
}

$list = $dom->getElementById('foo');
$items = $list->childNodes;
foreach ($items as $item) {
     print_r($item);
}

但是现在,我正在寻找一种简单的方法来读出data-text属性。我做的是:

foreach ($items as $item) {
     echo $item->getAttribute('data-text');
}

这适用于第一个项目,但随后它崩溃了foreach循环。输出是:

  

第1项   致命错误:调用未定义的方法DOMText :: getAttribute()   在第44行的example.php中

我不知道的是调用getAttribute方法如何更改foreach循环的上下文。所以这里有两个问题:

  1. 如何调用该方法搞砸了我的foreach循环?其次, 什么是最优雅的解决方法?
  2. 我意识到我可以遍历$item->attributes with而另一个 foreach方法,然后将属性名称与data-text进行比较 在匹配的情况下读取值,但肯定必须是 更好的方法吗?!

1 个答案:

答案 0 :(得分:8)

问题是ul有文本节点作为子节点,而li的文本节点没有属性,因此您会收到错误。在尝试访问其属性

之前,只测试子元素是否为元素节点
foreach ($items as $item) {
         if ($item->nodeType == XML_ELEMENT_NODE)
         echo $item->getAttribute('data-text');
}

您也可以使用getElementsByTagName(),但如果您有嵌套列表,则也会选择其中的li

$items = $list->getElementsByTagName('li');
foreach ($items as $item) {
    echo $item->getAttribute('data-text');
}