2010-04-15 4 views
3

Я создаю XML-документ «на лету». и мне нужно знать XPath узла, который я только что создал. Я не вижу такой функции, как DOMNode::calculateXPath(void):string , и я не хочу писать ее самостоятельно. есть ли какие-либо известные решения lite?PHP Получение XPath DOMNode

ответ

2

Для данного узла нет определенного XPath, поскольку XPath является поисковым запросом. Как и в google, вы можете найти определенную страницу, используя разные условия поиска. Более того, запрос XPath, возвращающий текущий узел, может (вероятно, будет) изменяться при изменении дерева DOM, поэтому путь, который вы можете получить, действителен только до тех пор, пока не будет выполнена следующая модификация дерева.

Вы можете указать каждому из своих уникальных идентификаторов или имени класса (класс более безопасен, если вы хотите использовать другие идентификаторы - может быть несколько классов и только один ID). Затем вы можете выполнить поиск с использованием этого класса/id.

Пример для диапазона тега и класса unique_1_:

//span[contains(@class, 'unique_1_')] 
3

Был аналогичный вопрос некоторое время назад, за который я отвечал что-то вдоль этих линий:

function calculateXPath(DOMNode $node) 
{ 
    $q  = new DOMXPath($node->ownerDocument); 
    $xpath = ''; 

    do 
    { 
     $position = 1 + $q->query('preceding-sibling::*[name()="' . $node->nodeName . '"]', $node)->length; 
     $xpath = '/' . $node->nodeName . '[' . $position . ']' . $xpath; 
     $node  = $node->parentNode; 
    } 
    while (!$node instanceof DOMDocument); 

    return $xpath; 
} 

Как отметил Томаш, хотя, он определенно не такой надежный или перспективный, как использование id.

+0

Я мог бы сделать это, используя ID.rather мою текущую версию осуществляется с помощью ID. Скорее я искал что-то еще. Я сделал другой поток для этого http://stackoverflow.com/questions/2644163/php-domxml-xpath-of-recursive-xpointer –

2

Я знаю, что это немного устарело, но я добавляю это на случай, если кто-то ищет это.

Начиная с PHP 5.2 существует DomNode::getNodePath(), в котором продолжается DomElement.

См: http://www.php.net/manual/en/domnode.getnodepath.php

Смежные вопросы