Я создаю XML-документ «на лету». и мне нужно знать XPath узла, который я только что создал. Я не вижу такой функции, как DOMNode::calculateXPath(void):string
и я не хочу писать ее самостоятельно. есть ли какое-нибудь известное решение сторонней стороны?
Для данного узла нет определенного XPath, поскольку XPath является поисковым запросом. Как и в google, вы можете найти определенную страницу, используя разные условия поиска. Более того, запрос XPath, возвращающий текущий узел, может (вероятно, будет) изменяться при изменении дерева DOM, поэтому путь, который вы можете получить, действителен только до тех пор, пока не будет выполнена следующая модификация дерева.
Вы можете указать каждому из своих уникальных идентификаторов или имени класса (класс более безопасен, если вы хотите использовать другие идентификаторы – может быть несколько классов и только один ID). Затем вы можете выполнить поиск с использованием этого класса / id.
Пример для диапазона тегов и класса unique_1_:
//span[contains(@class, 'unique_1_')]
Некоторое время назад был аналогичный вопрос, за что я написал что-то в этом роде:
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.
Я знаю, что это немного устарело, но я добавляю это на случай, если кто-то еще ищет это.
Начиная с PHP 5.2 существует DomNode::getNodePath()
в котором расширяется DomElement
.