|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
В javascript на базе DOM-структуры создаю xpath для определенной ноды. Нода находится внутри table, а потому XPath выглядит примерно так: /html/body/table[2]/tbody/tr/td[3]/table/tbody/tr/td/center При этом в тексте HTML тег tbody отсутствует, а в структуре DOM он генерируется автоматически браузером. В дальнейшем мне требуется использовать полученный xpath в PHP с использованием класса DOMXpath. И вот тут начинается самое интересное: DOM парсер PHP не вставляет автоматически tbody в иерархию DOM, а потому мой XPath просто ничего не находит. Просто тупо вырезать tbody из XPath я не могу, т.к.: 1 возможен ХТМЛ, в котором тег tbody будет присутствовать 2 этот-же XPath я использую в javascript, а там в иерархии DOM tbody есть всегда В связи с этим есть такие предполагаемых решения: 1 Самому вставлять tbody после каждого table в HTML перед обработкой в PHP - не лучшее решение, т.к. потребует менять текст ХТМЛ, который хотелось-бы оставить не тронутым. 2 Сформировать XPath так, чтобы при поиске tbody мог быть не обязательным - вот тут я не знаю как это сделать, т.к. это не регулярное выражение и аналога звездочки тут я не встречал. 3 При формировании XPath в javascript делать 2 разных XPath, для javascript и для PHP, но тогда надо знать, tbody был сгенерирован браузером или взят из текста ХТМЛ - каких-то признаков помогающих это сделать я не нашел Кто нибудь уже находил решение такой задачки? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2011, 13:01 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
Сделайте двойной запрос ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2011, 00:24 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
_Vasilisk_Сделайте двойной запрос То есть сделать 2 разных XPath... Но это не решит проблему... В ХТМЛ может быть table с tbody, внутри которого будет table без tbody. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2011, 10:17 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
dmitriy_rsl_Vasilisk_Сделайте двойной запросТо есть сделать 2 разных XPath... Но это не решит проблему... В ХТМЛ может быть table с tbody, внутри которого будет table без tbody. Не знаю наверняка, что имел ввиду василиск, может такую конструкцию, а может и нет: Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2011, 10:25 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
refregdmitriy_rslпропущено... То есть сделать 2 разных XPath... Но это не решит проблему... В ХТМЛ может быть table с tbody, внутри которого будет table без tbody. Не знаю наверняка, что имел ввиду василиск, может такую конструкцию, а может и нет: Код: plaintext
Это с одной таблицей в запросе поможет... а если количество вложенных таблиц не определено? для меня важно получить универсальный вариант. Нет в XPath никакой конструкции, типа: /html/body/table/(tbody|)/tr/td ? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2011, 10:33 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
dmitriy_rslдля меня важно получить универсальный вариант. Нет в XPath никакой конструкции, типа: /html/body/table/(tbody|)/tr/tdНеясно. Просто не знаю, разве браузер может вклинить несколько tbody между table и tr ? Или имеется ввиду что-то другое? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2011, 10:48 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
refregdmitriy_rslдля меня важно получить универсальный вариант. Нет в XPath никакой конструкции, типа: /html/body/table/(tbody|)/tr/tdНеясно. Просто не знаю, разве браузер может вклинить несколько tbody между table и tr ? Или имеется ввиду что-то другое? Имеется ввиду, что например 1-я таблица имеет tbody в тексте HTML, а вложенная в нее таблица - нет, еще более глубоко вложенная - опять имеет... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2011, 12:13 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
dmitriy_rsl, Опять же вопрос: так бывает? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2011, 12:24 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
refregdmitriy_rsl, Опять же вопрос: так бывает? А почему нет? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Я не знаю заранее какая структура будет у страницы, поэтому возможно все. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2011, 15:15 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
dmitriy_rsl, Что-то какая-то надуманная проблема. Ну, например, если в исходном уже есть tbody, то ставим в обе части. А браузер либо везде добавит, либо везде не добавит (вопрос, имелся ввиду - может ли браузер сам выборочно ставить tbody ? В каких вариантах он может в одном месте поставить tbody, а в другом не поставить? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2011, 15:33 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
refregdmitriy_rsl, Что-то какая-то надуманная проблема. Ну, например, если в исходном уже есть tbody, то ставим в обе части. А браузер либо везде добавит, либо везде не добавит (вопрос, имелся ввиду - может ли браузер сам выборочно ставить tbody ? В каких вариантах он может в одном месте поставить tbody, а в другом не поставить? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2011, 15:52 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
refregdmitriy_rsl, Что-то какая-то надуманная проблема. Ну, например, если в исходном уже есть tbody, то ставим в обе части. А браузер либо везде добавит, либо везде не добавит (вопрос, имелся ввиду - может ли браузер сам выборочно ставить tbody ? В каких вариантах он может в одном месте поставить tbody, а в другом не поставить? ) Браузер ставит всегда. Это я даже не обсуждаю... Проблема в том, что один и тот-же XPath используется и в браузере и на сервере. И вот на сервере возникает проблема. Ибо библиотеки PHP не имеют привычки вставлять tbody там, где его небыло в ХТМЛ. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2011, 15:53 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
dmitriy_rsl, вот теперь ясно ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2011, 16:00 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
Я имел в виду выбрать узел table, потом посмотреть есть ли у него tbody, если есть, то сместиться на один уровень вниз п применить остаток XPath. С точки зрения реализации выглядит примерно так 1) Ищем в XPath вхождение tbody 2) Откусываем подстроку до этого значения и делаем выборку узлов 3) Производим пропуск tbody, если он есть 4) Берем остаток XPath после tbody и переходим к пункту 1) Ну или как вариант Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 00:08 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
_Vasilisk_Я имел в виду выбрать узел table, потом посмотреть есть ли у него tbody, если есть, то сместиться на один уровень вниз п применить остаток XPath. С точки зрения реализации выглядит примерно так 1) Ищем в XPath вхождение tbody 2) Откусываем подстроку до этого значения и делаем выборку узлов 3) Производим пропуск tbody, если он есть 4) Берем остаток XPath после tbody и переходим к пункту 1) Ну или как вариант Код: plaintext
В XPath отсутствуют узлы с id. Если они встречаются, то путь строится начиная с них. Предлагаемая реализация конечно имеет право на существование, но что-то много возни вокруг tbody получается. А если будет еще какой-то тег с похожим поведением? Тогда надо будет придумывать то-же с этим тегом. Может есть решение получше? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 10:03 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
dmitriy_rsl, Вообще интересная задачка... Вот такая хрень пришла в голову: xml Код: plaintext 1. 2.
Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 10:49 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
refregdmitriy_rsl, Вообще интересная задачка... Вот такая хрень пришла в голову: xml Код: plaintext 1. 2.
Код: plaintext
Не совсем врубился, т.к. в XPath не силен... Мне нужно универсальное решение... частные случаи не годятся... У меня есть процедура составления XPath на основе DOM, вот ее я могу модифицировать. И хотелось-бы например если встречается tbody вставлять в XPath не "tbody", а какую-то последовательность, которая-бы указывала, что tbody - необязателен. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 11:58 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
dmitriy_rsl, dmitriy_rslНе совсем врубился, т.к. в XPath не силен... Смысл, предложенного мной XPath в том, что бы после table писать //tr с указанием количества предков до корневого (или, как вариант, известного предка). Таким образом будут отрезаться возможные tr , на более глубоких уровнях. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 12:06 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
refregdmitriy_rsl, dmitriy_rslНе совсем врубился, т.к. в XPath не силен... Смысл, предложенного мной XPath в том, что бы после table писать //tr с указанием количества предков до корневого (или, как вариант, известного предка). Таким образом будут отрезаться возможные tr , на более глубоких уровнях. ммм.... примерно понял... тоесть потенциально можно вместо tbody ставить лишний слеш... но тогда есть опасность получить не совсем то, что нужно с более глубоких уровней... зато пропуск tbody получится... остается только ограничить пропуск только 1 тегом, а не произвольным количеством. И для этого нужна конструкция типа "count(ancestor::*)" так? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 12:33 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
dmitriy_rslммм.... примерно понял... тоесть потенциально можно вместо tbody ставить лишний слеш... но тогда есть опасность получить не совсем то, что нужно с более глубоких уровней... зато пропуск tbody получится... остается только ограничить пропуск только 1 тегом, а не произвольным количеством. И для этого нужна конструкция типа "count(ancestor::*)" так? Да, смысл именно в пропуске 1 тега. Можно не предков, а потомков использовать - или еще что. Но, при этом желательно привязываться к уникальным элементам ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 12:38 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
refregdmitriy_rslммм.... примерно понял... тоесть потенциально можно вместо tbody ставить лишний слеш... но тогда есть опасность получить не совсем то, что нужно с более глубоких уровней... зато пропуск tbody получится... остается только ограничить пропуск только 1 тегом, а не произвольным количеством. И для этого нужна конструкция типа "count(ancestor::*)" так? Да, смысл именно в пропуске 1 тега. Можно не предков, а потомков использовать - или еще что. Но, при этом желательно привязываться к уникальным элементам а если сделать что-то типа проверки есть-ли на глубине не более 2 предков элемент table? Есть какая-то конструкция для этого? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 12:46 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
refregdmitriy_rsl, есть тоесть что-то вроде такого: Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 12:54 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
dmitriy_rsl, не, у любого tr есть ровно один parent::table или ровно один parent::tbody. Выражение будет истинно на всей глубине. наверно, count(ancestor::table)=1 для первой таблицы count(ancestor::table)=2 для вложенной таблицы и т.д. примерно так... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 13:04 |
|
XPath, javascript, PHP, tbody
|
|||
---|---|---|---|
#18+
refregdmitriy_rsl, не, у любого tr есть ровно один parent::table или ровно один parent::tbody. Выражение будет истинно на всей глубине. наверно, count(ancestor::table)=1 для первой таблицы count(ancestor::table)=2 для вложенной таблицы и т.д. примерно так... Это при составлении XPath придется вводить счетчик table... Не очень хорошее решение... Может как-то еще можно без этого? Есть подозрение, что совсем криворукие сайтописатели могут делать td прямо внутри table и тогда браузер автоматически добавит не только tbody, но и tr... А это опять специальная обработка уже для td и/или tr... Как-то оно все слишком сложно получается... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 13:25 |
|
|
start [/forum/topic.php?fid=14&msg=37349306&tid=1332911]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
78ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 317ms |
total: | 489ms |
0 / 0 |