php DOM getAttribute

php DOM getAttribute,php,dom,html-parsing,domdocument,getattribute,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

好吧,我这里有一个奇怪的例子,我就是搞不懂

我想解析网站上的列表。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>
<!-- ... -->
但是现在,我正在寻找一种简单的方法来读取
数据文本
属性。我所做的是:

foreach ($items as $item) {
     echo $item->getAttribute('data-text');
}
这对于第一个项目来说效果很好,但随后会使foreach循环崩溃。输出为:

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

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

  • 调用该方法如何会破坏我的foreach循环?其次 最优雅的解决方法是什么
  • 我意识到我可以用另一个循环遍历
    $item->attributes
    对于每个方法,然后将属性名称与
    数据文本进行比较,然后
    在匹配的情况下读取值,但肯定必须有
    这样做更好吗
    
    问题在于
    ul
    将文本节点作为子节点,而
    li
    s textnodes没有属性,因此您会得到一个错误。在尝试访问其属性之前,只需测试子节点是否为元素节点

    foreach ($items as $item) {
             if ($item->nodeType == XML_ELEMENT_NODE)
             echo $item->getAttribute('data-text');
    }
    
    您也可以使用,尽管如果您有嵌套列表,也会选择其中的
    li
    s

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

    啊,好了。现在一切都有意义了。由于列表确实是嵌套的,因此比较节点类型似乎是一个完美的方法。万分感谢!如果您var_dump这个节点类型,您将得到整数,请在
    $items = $list->getElementsByTagName('li');
    foreach ($items as $item) {
        echo $item->getAttribute('data-text');
    }