получение только последующих братьев и сестер того же типа, используя xpath и simplexml - PullRequest
0 голосов
/ 21 декабря 2009

Мне нужно проанализировать список определений 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 s и dd, когда они появляются?

1 Ответ

0 голосов
/ 21 декабря 2009

Конечно, есть способы найти последовательных совпадающих братьев и сестер в 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;
    }
}
...