如何在Xpath中为每个父节点添加不同数量的子节点值之间的分隔符

时间:2014-12-21 04:04:49

标签: php xpath

如果在PHP DOMXPath 中可以实现这一点的任何想法:我有例如3个父跨度,以及每个中的随机子节点数。首先,我收集的数据如下: “//span[@class='parent']”并获取第一个项目的节点值类似“Child TextChildText2Child Text 3”。

但是我试图使用逗号分隔符来获取“Child Text,ChildText2,Child Text 3”之类的内容。

有什么想法吗?我希望能够确定哪些孩子属于哪个孩子,同时我在父母中收集其他数据:

<span class="parent">Parent 1
    <span class="child">Child Text</span>
    <span class="child">ChildText2</span>
    <span class="child">Child Text 3</span>
</span>
<span class="parent">Parent 2
    <span class="child">Child Text4</span>
    <span class="child">ChildText5</span>

</span>
<span class="parent">Parent 3
    <span class="child">Child Text6</span>
    <span class="child">Child Text7</span>
    <span class="child">ChildText8</span>
    <span class="child">Child Text 9</span>
</span>

以下PHP是我目前使用的:

$array  = [];
$result = $xpath->query("//span[@class='parent']");
for ($x=0; $x<$result->length; $x++){
    $array[$x]['children'] = trim($result->item($x)->nodeValue);
}

2 个答案:

答案 0 :(得分:1)

使用xpath&gt; 2:

'string-join(//span[@class="parent"]/span, ",")'

输出:

Child Text,ChildText2,Child Text 3,Child Text4,ChildText5,Child Text6,Child Text7,ChildText8,Child Text 9

答案 1 :(得分:1)

我会直接在PHP中完成,而不是试图对xpath本身过于花哨。只需将节点值抛出一个数组,并用逗号作为分隔符implode()


实施例

$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);

foreach ($xpath->query('//span[@class="parent"]') as $parent) {
    $childText = [];
    foreach ($xpath->query('span[@class="child"]', $parent) as $child) {
        $childText[] = trim($child->nodeValue);
    }
    echo implode(',', $childText), "\n";
}

输出:

Child Text,ChildText2,Child Text 3
Child Text4,ChildText5
Child Text6,Child Text7,ChildText8,Child Text 9
相关问题