PHP DOMElement:: getElementsByTagName - Так или иначе для получения просто непосредственных детей соответствия?

есть ли способ получить только непосредственных детей, найденных вызовом к DOMElement:: getElementsByTagName? Например, у меня есть XML-документ, который имеет элемент категории. Тот элемент категории имеет sub элементы категории (которые имеют ту же структуру), как:

<category>
    <id>1</id>
    <name>Top Level Category Name</name>
    <subCategory>
        <id>2</id>
        <name>Sub Category Name</name>
    </subCategory>
    ...
</category>

Если у меня есть DOMElement представление высокоуровневой категории,

$topLevelCategoryElement->getElementsByTagName('id');

возвратит список с узлами для всех 'идентификационных' элементов, где я хочу просто тот от верхнего уровня. Какой-либо способ сделать это за пределами использования XPath?

7
задан rr. 15 June 2010 в 22:52
поделиться

3 ответа

Боюсь, что нет. Вам придется перебирать дочерние элементы или использовать XPath.

for ($n = $parent->firstChild; $n !== null; $n = $n->nextSibling) {
    if ($n instanceof DOMElement && $n->tagName == "xxx") {
        //...
    }
}

Пример с XPath и вашим XML-файлом:

$xml = ...;
$d = new DOMDocument();
$d->loadXML($xml);
$cat = $d->getElementsByTagName("subCategory")->item(0);
$xp = new DOMXpath($d);
$q = $xp->query("id", $cat); //note the second argument
echo $q->item(0)->textContent;

дает 2 .

16
ответ дан 6 December 2019 в 06:23
поделиться

Что-то вроде этого должно получиться

/**
 * Traverse an elements children and collect those nodes that
 * have the tagname specified in $tagName. Non-recursive
 *
 * @param DOMElement $element
 * @param string $tagName
 * @return array
 */
function getImmediateChildrenByTagName(DOMElement $element, $tagName)
{
    $result = array();
    foreach($element->childNodes as $child)
    {
        if($child instanceof DOMElement && $child->tagName == $tagName)
        {
            $result[] = $child;
        }
    }
    return $result;
}

edit: добавлена проверка instanceof DOMElement

11
ответ дан 6 December 2019 в 06:23
поделиться

Я не Не использует PHP, но если PHP действительно реализует DOM API, как определил W3C , то для любого объекта Node должно быть свойство childNodes. Вы должны иметь возможность перебирать всех прямых потомков и проверять их имена тегов, чтобы увидеть, являются ли они тем, что вы ищете. В зависимости от того, как выглядит ваше дерево, это может быть медленнее, чем получение всех элементов по имени тега и проверка их положения в дереве, или может быть значительно быстрее.

2
ответ дан 6 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: