DOM: с помощью PHP, как выяснить, является ли узел последним потомком своего родителя - PullRequest
0 голосов
/ 16 апреля 2010

Я пытаюсь выяснить, как узнать, является ли узел последним дочерним элементом другого или нет.

Я знаю, как получить имя lastChild родителя ($node->parentNode->lastChild->nodeName), но так как иногда в одном и том же родительском объекте есть много одинаковых имен узлов, имя определенно не способ найти последнего потомка.

Я ищу какой-то итератор, который может получить количество дочерних элементов и, в зависимости от положения текущего узла, сказать, является ли текущий узел последним дочерним элементом.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 16 апреля 2010

С точки зрения чистого DOM, если дочерний элемент является последним дочерним элементом родителя, его свойство nextSibling будет null.

Пример Javascript (не то, что вы ищете Javascript специально):

if (!child.nextSibling) {
    // It's the last child
}

Важно отметить, что nextSibling пересекает узлы . Иногда вы хотите пройти элементы вместо (в отличие от текстовых узлов и тому подобное). Например, в этой разметке:

<p>Testing <span>one</span> two three</p>

... span - не последний узел в своем контейнере (поскольку за ним следует текстовый узел), но это последний элемент в своем контейнере. Если вы хотите посмотреть на это, вам необходим цикл, проверяющий nodeType, например ::

// =====
// Note: This example is in JavaScript, but I assume it's easy enough
// to follow what it's doing and translate it to PHP
// =====

// Utility function
function nextElement(node) {
    var rv = node.nextSibling;
    while (rv && rv.nodeType !== 1) {
        rv = rv.nextSibling;
    }
    return rv;
}

// Usage
if (!nextElement(child)) {
    // There was no element after `child`
}
1 голос
/ 16 апреля 2010

Поскольку это вопрос PHP, я оставлю ответ PHP (используя DOM ) для потомков:

if ($node->isSameNode($node->parentNode->lastChild))
{
    //...
}

А если вы используете SimpleXML, просто преобразуйте ваш узел с помощью dom_import_simplexml () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...