2009-05-02 9 views
0

У меня есть следующий урезанный код PHP ...PHP XPath - получить позицию узла

foreach ($xpath->query('/html/body//a')} as $queryitem) { 
    $nodeposition = ???; 
    $parentposition = ???; 
} 

... от этого можно найти положение каждого узла и положение его родитель?

, например:

0..<html>
1....<head>
2......<title>
3......<meta>
4......<meta>
5....<body>
6......<div>
7........<a>

Это приведет к созданию идентификатора для каждого тега и идентификатора родительского тега, к которому он присоединяется.

Таким образом, результаты были бы = 0 |, 1 | 0,2 | 1,3 | 1,4 | 1,5 | 0,6 | 5,7 | 6

+0

Что вы подразумеваете под позицией? Позиция узла в дереве? – Gumbo

+0

да, поэтому я могу восстановить его части позже из базы данных – EddyR

+0

Какова была бы позиция родителя? Позиция в результирующем наборе для // * в порядке документа? VolkerK

ответ

1

Я не верю тебе сможет получить позицию (читать xpath) внутри dom, если вы не сделаете какую-нибудь причудливую кодировку самостоятельно.

1

Чтобы решить эту проблему, вам необходимо знать полное дерево DOM. Но с XPath вы просто получаете определенные поддеревья, соответствующие пути. Вам нужно будет ходить по дереву один за другим и получать информацию для каждого элемента, сопоставленного с XPath. Но это может быть неэффективным. Было бы лучше, если вы пройдете дерево от корня вниз и подсчитаете количество узлов.

2

Если на «позиции» вы имеете в виду количество предшествующих узлов (как вы, кажется, подразумевают в вашей выборке), то это будет работать (возможно, не в эффективности первосортной, но тем не менее):

foreach ($xpath->query('/html/body//a') as $queryitem) { 
    $nodeposition = count($xpath->query('preceding::*', $queryitem)); 

    $parent = $xpath->query('parent::*', $queryitem); 
    if ($parent->length == 1) 
    $parentposition = count($xpath->query('preceding::*', $parent->item(0))); 
    else 
    $parentposition = -1; // or whatever 
} 

Не тестировалось, но вы поняли идею.

Альтернативой было бы преобразование преобразования идентификатора XSLT, которое добавляет позицию ко всем узлам в документе в качестве атрибута. Затем вы можете прочитать атрибут в вашем PHP-коде.

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