Запрос DomCrawler FilterXPath

У меня есть html, например, ниже:

<html>
<body> 
... other html stuff ...
<form method="post" action="goSomewhere">
    <input type="hidden" value="something">
    <input type="hidden" value="something2">
<table>
    <tr><td><input type="checkbox" name="123">Stuff 1</td></tr>
    <tr><td><input type="checkbox" checked name="456">Stuff 2</td></tr>
    <tr><td><input type="checkbox" name="789">Stuff 3</td></tr>
</body> 
</html>

Я пытаюсь выбрать все в <form>, кроме тега с определенным именем (innerhtml, то есть). Вот запрос, который я использую:

$query = "//form//td[not(normalize-space() = 'Stuff 2')]"; 

Это успешно отфильтровывает это конкретное <td> содержания, но проблема в том, что оно тогда возвращает только <td> содержания. Как видите, есть и другие <input>, которых нет в <table>, и они мне тоже нужны.

Может ли кто-нибудь помочь с этим запросом, пожалуйста? Спасибо!


person Kenny    schedule 30.12.2015    source источник


Ответы (1)


Вы ищете //form//td[not(normalize-space() = 'Stuff 2')]/input|//input[not(ancestor::table)].

person xabbuh    schedule 30.12.2015
comment
Благодарю вас! Казалось, это сработало! У вас есть идея, как я могу просто получить все элементы в теге form? По некоторым причинам возврат input кажется пустым. На самом деле мне все еще нужен контент table/td. Я пытался изменить ../form|//form[not(ancestor::form)], но это ничего не дало. - person Kenny; 30.12.2015
comment
Не уверен, что понимаю. Можете ли вы объяснить, какие узлы вы пропустили? - person xabbuh; 30.12.2015
comment
Если я делаю print_r объекта сканера (содержащего все входные данные), он печатает пустые объекты. Итак, в основном я изменяю свой первоначальный запрос: вместо того, чтобы получать все входные данные (за исключением этого конкретного с именем Stuff 2), я хотел бы получить все содержимое между <form> и </form>. - person Kenny; 30.12.2015
comment
Вы можете использовать метод reduce() класса Crawler, который принимает обратный вызов, используемый для фильтрации узлов. - person xabbuh; 30.12.2015