我需要解析一个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
的每个孩子,并在他们出现时移过任何dt
和dd
?
答案 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;
}
}