【问题标题】:Iterating through child li nodes in xpath遍历 xpath 中的子 li 节点
【发布时间】:2019-01-23 20:42:49
【问题描述】:

我有以下 HTML:

$page = '<html>
<head>
<title>Page</title>
</head>

<body>

<div>
    <div>
        <div>
        </div>
        <div class="this one">
            <h2>Ignore</h2>
            <p>Text</p>

            <h2>Header 1</h2>
            <ul><li>List Value 1</li></ul>

            <h2>Header 2</h2>
            <ul><li>List Value 2</li></ul>

            <h2>Ignore</h2>
            <ul><li>List Value 3</li></ul>

            <h2>Header 3</h2>
            <ul>
                <li>List Value A</li>
                <li>List Value B</li>
                <li>List Value C</li>
            </ul>

            <h2>Ignore</h2>
            <p>Text</p>
        </div>
    </div>
</div>

</body>
</html>';

我正在尝试仅获取 Header 3li 列表,但以下代码不起作用;

$doc->loadHTML($page);   
$xpath = new DomXPath($doc);

$nodes = $xpath->query("//div[@class='this one']/h2[.='Header 3']/ul/li");
foreach($nodes as $node) { 
    echo $node->nodeValue . "<br />";
}

我期待输出:

List Value A<br />
List Value B<br />
List Value C<br />

【问题讨论】:

    标签: php dom xpath


    【解决方案1】:

    这是你想要的表达方式:

    //div[@class = 'this one']/h2[text() = 'Header 3']/following-sibling::ul[1]/li
    

    稍微分解一下:

    • //div[@class = 'this one'] - 将文档中的所有&lt;div&gt;s 与指定的class 属性值匹配

    • …/h2[text() = 'Header 3'] - 匹配所有&lt;h2&gt;s,这些&lt;h2&gt;s 是具有指定文本内容的&lt;div&gt;s 的子代

    • …/following-sibling::ul - 使用following-sibling 轴匹配出现在&lt;h2&gt;s 之后的&lt;ul&gt;s

    • …[1] - 仅匹配第一个 &lt;ul&gt;,它是匹配的 &lt;h2&gt; 的兄弟(...记住 XPath 表达式中的索引是从 1 开始的

    • …/li - 匹配所有&lt;li&gt;s,它们是&lt;ul&gt;的孩子

    【讨论】:

    • @BojanSrbinoski ,因为ul 不是h2 的孩子,而是它的兄弟
    • @Andersson 哦哦哦。这就是为什么正确的缩进很重要;)
    • 我还会指定列表的索引 (following-sibling::ul[1]),以防有更多的后续标题和列表(例如 &lt;h2&gt;Header 4&lt;/h2&gt;&lt;ul&gt;...&lt;/ul&gt;),以便只有 直接兄弟已获取
    • @splash58,如果我完全移动了&lt;ul&gt;(没有在当前位置留下副本),那么我仍然会看到相同的输出。这似乎是错误的。我会努力的。
    猜你喜欢
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    相关资源
    最近更新 更多