使用xpath和simplexml只获得相同类型的后续兄弟

时间:2009-12-21 01:12:21

标签: php xpath simplexml

我需要解析一个html定义列表,如下所示:

<dl>
    <dt>stuff</dt>
        <dd>junk</dd>
        <dd>things</dd>
        <dd>whatnot</dd>
    <dt>colors</dt>
        <dd>red</dd>
        <dd>green</dd>
        <dd>blue</dd>
</dl>

这样我最终可以得到一个像这样的关联数组:

[definition list] =>
    [stuff] =>
        [0] => junk
        [1] => things
        [2] => whatnot
    [colors] =>
        [0] => red
        [1] => green
        [2] => blue

我使用DOMDocument -> loadHTML()将HTML字符串导入对象,然后simplexml_import_dom()使用simplexml扩展名,特别是xpath

我遇到的问题是使用XPath语法查询连续且未被<dd>打破的所有<dt>个元素。

由于<dd>元素不被视为<dt>元素的子元素,因此我不能简单地遍历所有dt的查询并查询所有dd

所以我想我必须对每个dd的第一个dt兄弟进行查询,然后对第一个dd的所有dd兄弟进行查询。

但是我不清楚XPath教程是否可行。你能说“连续匹配的兄弟姐妹”吗?或者我是否被迫绕过原始dl的每个孩子,并在他们出现时移过任何dtdd

1 个答案:

答案 0 :(得分:0)

有一些方法可以在XPath中找到连续匹配的兄弟姐妹,但它会相对复杂,因为无论如何你必须处理每个孩子,你也可以像你提到的那样循环遍历它们。它比循环<dt/>然后寻找兄弟姐妹更简单,更有效。

$dl = simplexml_load_string(
    '<dl>
        <dt>stuff</dt>
            <dd>junk</dd>
            <dd>things</dd>
            <dd>whatnot</dd>
        <dt>colors</dt>
            <dd>red</dd>
            <dd>green</dd>
            <dd>blue</dd>
    </dl>'
);

$list = array();
foreach ($dl->children() as $child)
{
    switch (dom_import_simplexml($child)->localName)
    {
        case 'dt':
            $k = (string) $child;
            break;

        case 'dd':
            $list[$k][] = (string) $child;
            break;
    }
}