2010-01-01 3 views
4

Использование DOMXPath :: query возможно получить только один уровень глубины childNodes?XPath, чтобы получить один уровень childnodes

Например, если у меня был документ, как:

<div> 
    <span> 
     <cite> 
     </cite> 
    </span> 
    <span> 
     <cite> 
     </cite> 
    </span> 
</div> 

Я хотел бы, чтобы NodeList содержать только те пролеты и не приводит.

Следует также упомянуть, что это не всегда будут одни и те же элементы (divs, span и т. Д.). Мне нужно, чтобы он работал с любым типом элемента.

Это то, что я пытался, и это не похоже на работу:

//*[not(ancestor::div)] 

ответ

3

Если вы используете

/div/* 

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

Используется ось по умолчанию, она называется child::. Эта ось возвращает только элементы 1 уровня в соответствии с текущим узлом

* матчей всех элементами, но ни атрибуты, ни текст()

Вы должны указать путь к узлу и быть осторожным //node, потому что это означает descendant::node и его возвращает все узлы этого имени в этом дереве

+0

Спасибо за предложение ребенка :: axis. Это должен быть принятый ответ. – Eternal21

2

Ваш вопрос немного недописан, поэтому существует несколько способов его интерпретации. Если вы хотите, чтобы все прямые элементы дочерних текущего элемента (со всеми их подэлементам), а затем использовать

*/* 

Для примера, это дает вам

<span> 
    <cite> 
    </cite> 
</span> 

и

<span> 
    <cite> 
    </cite> 
</span> 

Если вы хотите всех детей узлов, тогда используйте node() вместо *:

*/node() 

Для вашего примера это дает вам оба подэлемента, как указано выше, наряду с узлами новой строки/отступов text().

Если вы хотите, чтобы только дочерние узлы, а не их дети (т.только span элементы, но без их дочерних элементов), необходимо использовать два выражения:

  1. выбрать элементы прямого потомка с помощью */*
  2. процесса в те дочерние элементы и выбирать только текстовые узлы, а не элементы внуков через text()

Мой PHP немного ржавый, но он должен работать как-нибудь так:

$doc = new DOMDocument; 
// set up $doc 
$xpath = new DOMXPath($doc); 

// perform step #1 
$childElements = $xpath->query('*/*'); 

$directChildren = array(); 
foreach ($childElements as $child) { 
    // perform step #2 
    $textChildren = $xpath->query('text()', $child); 
    foreach ($textChildren as $text) { 
    $directChildren[] = $text; 
    } 
} 
// now, $directChildren contains all text nodes 
+0

Спасибо, последнее, что я ищу. Просто прямые дочерние узлы, нет внуков. Можете ли вы расширить этот пример? У меня есть> очень <новый для XPath, и он еще не совсем нажал. – Greg

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