【问题标题】:php DOM getAttributephp DOM 获取属性
【发布时间】:2013-01-12 08:58:38
【问题描述】:

好的,所以我这里有一个奇怪的案例,我只是想不通。

我想解析网站上的列表。 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-&gt;attributes with foreach 方法,然后将属性名称与data-text 和 在匹配的情况下读取值,但肯定必须有一个 更好的方法?!

【问题讨论】:

    标签: php dom html-parsing domdocument getattribute


    【解决方案1】:

    问题是ul 有文本节点作为子节点,而lis 文本节点没有属性,因此您会收到错误消息。在尝试访问其属性之前,只需测试子节点是否为元素节点

    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');
    }
    

    【讨论】:

    • 啊,我们走了。现在一切都说得通了。由于列表确实是嵌套的,比较 nodeType 似乎是完美的方法。谢谢一百万!
    • 如果您对 nodeType 进行 var_dump,您将获得整数,请查看 php.net/manual/en/dom.constants.php 处的 int 值
    猜你喜欢
    • 2020-11-03
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多