powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XPath, javascript, PHP, tbody
25 сообщений из 27, страница 1 из 2
XPath, javascript, PHP, tbody
    #37346040
dmitriy_rsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В 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 был сгенерирован браузером или взят из текста ХТМЛ - каких-то признаков помогающих это сделать я не нашел

Кто нибудь уже находил решение такой задачки?
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37347034
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделайте двойной запрос
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37347360
dmitriy_rsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_Сделайте двойной запрос

То есть сделать 2 разных XPath... Но это не решит проблему... В ХТМЛ может быть table с tbody, внутри которого будет table без tbody.
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37347374
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmitriy_rsl_Vasilisk_Сделайте двойной запросТо есть сделать 2 разных XPath... Но это не решит проблему... В ХТМЛ может быть table с tbody, внутри которого будет table без tbody. Не знаю наверняка, что имел ввиду василиск, может такую конструкцию, а может и нет:
Код: plaintext
select="(/html/body/table[2]/tbody/tr/td[3]/table/tbody/tr/td/center | /html/body/table[2]/tr/td[3]/table/tr/td/center)"
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37347389
dmitriy_rsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refregdmitriy_rslпропущено...
То есть сделать 2 разных XPath... Но это не решит проблему... В ХТМЛ может быть table с tbody, внутри которого будет table без tbody. Не знаю наверняка, что имел ввиду василиск, может такую конструкцию, а может и нет:
Код: plaintext
select="(/html/body/table[2]/tbody/tr/td[3]/table/tbody/tr/td/center | /html/body/table[2]/tr/td[3]/table/tr/td/center)"



Это с одной таблицей в запросе поможет... а если количество вложенных таблиц не определено? для меня важно получить универсальный вариант. Нет в XPath никакой конструкции, типа: /html/body/table/(tbody|)/tr/td ?
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37347420
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmitriy_rslдля меня важно получить универсальный вариант. Нет в XPath никакой конструкции, типа: /html/body/table/(tbody|)/tr/tdНеясно. Просто не знаю, разве браузер может вклинить несколько tbody между table и tr ? Или имеется ввиду что-то другое?
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37347609
dmitriy_rsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refregdmitriy_rslдля меня важно получить универсальный вариант. Нет в XPath никакой конструкции, типа: /html/body/table/(tbody|)/tr/tdНеясно. Просто не знаю, разве браузер может вклинить несколько tbody между table и tr ? Или имеется ввиду что-то другое?

Имеется ввиду, что например 1-я таблица имеет tbody в тексте HTML, а вложенная в нее таблица - нет, еще более глубоко вложенная - опять имеет...
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37347630
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmitriy_rsl,

Опять же вопрос: так бывает?
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37348116
dmitriy_rsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refregdmitriy_rsl,

Опять же вопрос: так бывает?

А почему нет?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<table>
<tbody>
<tr><td>
<table>
<tr>
<td> 1 </td>
</tr>
</table>
</td>
</tr>
</tbody>
</table>

Я не знаю заранее какая структура будет у страницы, поэтому возможно все.
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37348167
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmitriy_rsl,

Что-то какая-то надуманная проблема. Ну, например, если в исходном уже есть tbody, то ставим в обе части. А браузер либо везде добавит, либо везде не добавит (вопрос, имелся ввиду - может ли браузер сам выборочно ставить tbody ? В каких вариантах он может в одном месте поставить tbody, а в другом не поставить? )
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37348241
dmitriy_rsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refregdmitriy_rsl,

Что-то какая-то надуманная проблема. Ну, например, если в исходном уже есть tbody, то ставим в обе части. А браузер либо везде добавит, либо везде не добавит (вопрос, имелся ввиду - может ли браузер сам выборочно ставить tbody ? В каких вариантах он может в одном месте поставить tbody, а в другом не поставить? )
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37348246
dmitriy_rsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refregdmitriy_rsl,

Что-то какая-то надуманная проблема. Ну, например, если в исходном уже есть tbody, то ставим в обе части. А браузер либо везде добавит, либо везде не добавит (вопрос, имелся ввиду - может ли браузер сам выборочно ставить tbody ? В каких вариантах он может в одном месте поставить tbody, а в другом не поставить? )


Браузер ставит всегда. Это я даже не обсуждаю... Проблема в том, что один и тот-же XPath используется и в браузере и на сервере. И вот на сервере возникает проблема. Ибо библиотеки PHP не имеют привычки вставлять tbody там, где его небыло в ХТМЛ.
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37348270
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmitriy_rsl,

вот теперь ясно
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37348955
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имел в виду выбрать узел table, потом посмотреть есть ли у него tbody, если есть, то сместиться на один уровень вниз п применить остаток XPath.

С точки зрения реализации выглядит примерно так
1) Ищем в XPath вхождение tbody
2) Откусываем подстроку до этого значения и делаем выборку узлов
3) Производим пропуск tbody, если он есть
4) Берем остаток XPath после tbody и переходим к пункту 1)

Ну или как вариант
Код: plaintext
//td[@id = 'mycell']
и никакого геморроя
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37349222
dmitriy_rsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_Я имел в виду выбрать узел table, потом посмотреть есть ли у него tbody, если есть, то сместиться на один уровень вниз п применить остаток XPath.

С точки зрения реализации выглядит примерно так
1) Ищем в XPath вхождение tbody
2) Откусываем подстроку до этого значения и делаем выборку узлов
3) Производим пропуск tbody, если он есть
4) Берем остаток XPath после tbody и переходим к пункту 1)

Ну или как вариант
Код: plaintext
//td[@id = 'mycell']
и никакого геморроя

В XPath отсутствуют узлы с id. Если они встречаются, то путь строится начиная с них.
Предлагаемая реализация конечно имеет право на существование, но что-то много возни вокруг tbody получается. А если будет еще какой-то тег с похожим поведением? Тогда надо будет придумывать то-же с этим тегом. Может есть решение получше?
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37349306
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmitriy_rsl,

Вообще интересная задачка... Вот такая хрень пришла в голову:
xml
Код: plaintext
1.
2.
<html><table><tbody><tr><td><table><tbody><tr>
	<td> 1 </td>
</tr></tbody></table></td></tr></tbody></table></html>
xPath
Код: plaintext
/html/table//tr[count(ancestor::*)<= 4 ]/td/table//tr[count(ancestor::*)<= 9 ]/td
Работать будет не всегда (не при любом XML), но на очень многих. Принцип, думаю, понятен. В каких-то случаях можно условие диапазоном написать.
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37349449
dmitriy_rsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refregdmitriy_rsl,

Вообще интересная задачка... Вот такая хрень пришла в голову:
xml
Код: plaintext
1.
2.
<html><table><tbody><tr><td><table><tbody><tr>
	<td> 1 </td>
</tr></tbody></table></td></tr></tbody></table></html>
xPath
Код: plaintext
/html/table//tr[count(ancestor::*)<= 4 ]/td/table//tr[count(ancestor::*)<= 9 ]/td
Работать будет не всегда (не при любом XML), но на очень многих. Принцип, думаю, понятен. В каких-то случаях можно условие диапазоном написать.

Не совсем врубился, т.к. в XPath не силен...
Мне нужно универсальное решение... частные случаи не годятся... У меня есть процедура составления XPath на основе DOM, вот ее я могу модифицировать. И хотелось-бы например если встречается tbody вставлять в XPath не "tbody", а какую-то последовательность, которая-бы указывала, что tbody - необязателен.
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37349463
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmitriy_rsl,

dmitriy_rslНе совсем врубился, т.к. в XPath не силен... Смысл, предложенного мной XPath в том, что бы после table писать //tr с указанием количества предков до корневого (или, как вариант, известного предка). Таким образом будут отрезаться возможные tr , на более глубоких уровнях.
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37349510
dmitriy_rsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refregdmitriy_rsl,

dmitriy_rslНе совсем врубился, т.к. в XPath не силен... Смысл, предложенного мной XPath в том, что бы после table писать //tr с указанием количества предков до корневого (или, как вариант, известного предка). Таким образом будут отрезаться возможные tr , на более глубоких уровнях.

ммм.... примерно понял... тоесть потенциально можно вместо tbody ставить лишний слеш... но тогда есть опасность получить не совсем то, что нужно с более глубоких уровней... зато пропуск tbody получится... остается только ограничить пропуск только 1 тегом, а не произвольным количеством. И для этого нужна конструкция типа "count(ancestor::*)" так?
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37349519
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmitriy_rslммм.... примерно понял... тоесть потенциально можно вместо tbody ставить лишний слеш... но тогда есть опасность получить не совсем то, что нужно с более глубоких уровней... зато пропуск tbody получится... остается только ограничить пропуск только 1 тегом, а не произвольным количеством. И для этого нужна конструкция типа "count(ancestor::*)" так? Да, смысл именно в пропуске 1 тега. Можно не предков, а потомков использовать - или еще что. Но, при этом желательно привязываться к уникальным элементам
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37349535
dmitriy_rsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refregdmitriy_rslммм.... примерно понял... тоесть потенциально можно вместо tbody ставить лишний слеш... но тогда есть опасность получить не совсем то, что нужно с более глубоких уровней... зато пропуск tbody получится... остается только ограничить пропуск только 1 тегом, а не произвольным количеством. И для этого нужна конструкция типа "count(ancestor::*)" так? Да, смысл именно в пропуске 1 тега. Можно не предков, а потомков использовать - или еще что. Но, при этом желательно привязываться к уникальным элементам

а если сделать что-то типа проверки есть-ли на глубине не более 2 предков элемент table? Есть какая-то конструкция для этого?
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37349539
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmitriy_rsl,

есть
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37349558
dmitriy_rsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refregdmitriy_rsl,

есть

тоесть что-то вроде такого:

Код: plaintext
html/body/table//tr[count(parent::table) >  0  or count(parent::tbody) >  0 ]/td/
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37349584
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmitriy_rsl,

не, у любого tr есть ровно один parent::table или ровно один parent::tbody. Выражение будет истинно на всей глубине.

наверно,
count(ancestor::table)=1 для первой таблицы
count(ancestor::table)=2 для вложенной таблицы
и т.д.
примерно так...
...
Рейтинг: 0 / 0
XPath, javascript, PHP, tbody
    #37349647
dmitriy_rsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refregdmitriy_rsl,

не, у любого tr есть ровно один parent::table или ровно один parent::tbody. Выражение будет истинно на всей глубине.

наверно,
count(ancestor::table)=1 для первой таблицы
count(ancestor::table)=2 для вложенной таблицы
и т.д.
примерно так...

Это при составлении XPath придется вводить счетчик table... Не очень хорошее решение... Может как-то еще можно без этого?

Есть подозрение, что совсем криворукие сайтописатели могут делать td прямо внутри table и тогда браузер автоматически добавит не только tbody, но и tr... А это опять специальная обработка уже для td и/или tr... Как-то оно все слишком сложно получается...
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XPath, javascript, PHP, tbody
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]