А про XPath вопросы в какой форум задавать?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 06.03.18 22:14
Оценка:
Здравствуйте!

Сабж, собственно.

XPath 1.0

Есть XPath выражение: "/Project/Targets/Target/Groups/Group[string(GroupName)=$name]/preceding-sibling::text()". Оно не срабатывает, а выкидывает ошибку, мол не могу выполнить
Другое выражение : "/Project/Targets/Target/Groups/Group[string(GroupName)=$name]" — отрабатывает норм, находит весь тэг Group, у которого есть сабтэг GroupName с содержимым $name

Первое XPath-выражение, которое не срабатывает, должно найти простой текстовый узел на том же уровне, что и референсный тэг Group, который предшествует тэгу Group

Я в составлении XPath-выражения прямо скажу, не силен, мог и облажаться. Вопрос в том — это XPath выражение косячное, или баги в XML/XPath движке?
Маньяк Робокряк колесит по городу
Re: А про XPath вопросы в какой форум задавать?
От: · Великобритания  
Дата: 06.03.18 22:40
Оценка: 4 (1)
Здравствуйте, Marty, Вы писали:

M> Есть XPath выражение: "/Project/Targets/Target/Groups/Group[string(GroupName)=$name]/preceding-sibling::text()". Оно не срабатывает, а выкидывает ошибку, мол не могу выполнить

Я не могу понять описание задачи. Приведи пример входного xml с объяснением чего ты хочешь выбрать.
Твоя конструкция не работает потому preceding-sibling ожидает тег, чтобы выбрать всё поддерево, очевидно что тут использовать text() — бессмыслица.
Вот удобная картинка чтобы понимать что делают разные axes:
avalon/2.0.6
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: А про XPath вопросы в какой форум задавать?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 06.03.18 23:20
Оценка:
Здравствуйте, ·, Вы писали:


M>> Есть XPath выражение: "/Project/Targets/Target/Groups/Group[string(GroupName)=$name]/preceding-sibling::text()". Оно не срабатывает, а выкидывает ошибку, мол не могу выполнить

·>Я не могу понять описание задачи. Приведи пример входного xml с объяснением чего ты хочешь выбрать.

Исходное поддерево:
...
        <Group>
          <GroupName>github_misc_stm32_meekdai_stm32_grbl</GroupName>
          <Files>
...
          </Files>
        </Group>
...


Я могу выбрать нужный тэг Group через выражение "/Project/Targets/Target/Groups/Group[string(GroupName)=$name]" где name задается как "github_misc_stm32_meekdai_stm32_grbl", и удалить его.
И — мне нужно выбрать текст (который есть пустая строка чисто для отступа, с переводом строки) перед этим тэгом, чтобы его тоже удалить и корректно модифицировать дерево, чтобы не появлялось пустых строк и прочих артефактов.
Потому что если я просто удаляю найденый тег, то остается пустая строка и ненужный перевод строки, и это очень мешает

·>Твоя конструкция не работает потому preceding-sibling ожидает тег, чтобы выбрать всё поддерево, очевидно что тут использовать text() — бессмыслица.

·>Вот удобная картинка чтобы понимать что делают разные axes:
·>Image: 7x1B0.gif

Спасибо, но пока не помогло
Маньяк Робокряк колесит по городу
Re[3]: А про XPath вопросы в какой форум задавать?
От: · Великобритания  
Дата: 06.03.18 23:48
Оценка: 4 (1)
Здравствуйте, Marty, Вы писали:

M>Я могу выбрать нужный тэг Group через выражение "/Project/Targets/Target/Groups/Group[string(GroupName)=$name]" где name задается как "github_misc_stm32_meekdai_stm32_grbl", и удалить его.

M>И — мне нужно выбрать текст (который есть пустая строка чисто для отступа, с переводом строки) перед этим тэгом, чтобы его тоже удалить и корректно модифицировать дерево, чтобы не появлялось пустых строк и прочих артефактов.
M>Потому что если я просто удаляю найденый тег, то остается пустая строка и ненужный перевод строки, и это очень мешает
Что-то я наврал. preceding-sibling::text() вроде должен работать. Но он выберет все предыдущие узлы text(). Тебе нужен только один [1].
/Project/Targets/Target/Groups/Group[string(GroupName)=$name]/preceding-sibling::text()[1] должно работать, вроде.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: А про XPath вопросы в какой форум задавать?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 07.03.18 00:28
Оценка:
Здравствуйте, ·, Вы писали:

M>>Я могу выбрать нужный тэг Group через выражение "/Project/Targets/Target/Groups/Group[string(GroupName)=$name]" где name задается как "github_misc_stm32_meekdai_stm32_grbl", и удалить его.

M>>И — мне нужно выбрать текст (который есть пустая строка чисто для отступа, с переводом строки) перед этим тэгом, чтобы его тоже удалить и корректно модифицировать дерево, чтобы не появлялось пустых строк и прочих артефактов.
M>>Потому что если я просто удаляю найденый тег, то остается пустая строка и ненужный перевод строки, и это очень мешает
·>Что-то я наврал. preceding-sibling::text() вроде должен работать. Но он выберет все предыдущие узлы text(). Тебе нужен только один [1].
·>/Project/Targets/Target/Groups/Group[string(GroupName)=$name]/preceding-sibling::text()[1] должно работать, вроде.

Да, изначально запрос и был точно таким, я его начал упрощать для отладки, чтобы понять, кто врет. Похоже, врет мой XML/XPath движек, буду дебажить
Маньяк Робокряк колесит по городу
Re[3]: А про XPath вопросы в какой форум задавать?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 07.03.18 01:20
Оценка:
Здравствуйте, Marty, Вы писали:

M>Исходное поддерево:

M>
M>...
M>        <Group>
M>          <GroupName>github_misc_stm32_meekdai_stm32_grbl</GroupName>
M>          <Files>
M>...
M>          </Files>
M>        </Group>
M>...
M>

Предлагаю вместо
"/Project/Targets/Target/Groups/Group[string(GroupName)=$name]/preceding-sibling::text()"
сделать как-то так
"/Project/Targets/Target/Groups[Group/string(GroupName)=$name]/Files::text()"

Т.е. явно выбирать Grops/Files, но в таких Groups, у которых есть child Group с нужным условием. Не уверен за решение, вообще не знаю XPath.
Re[4]: А про XPath вопросы в какой форум задавать?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 07.03.18 01:24
Оценка:
Здравствуйте, samius, Вы писали:

S>Предлагаю вместо

S>"/Project/Targets/Target/Groups/Group[string(GroupName)=$name]/preceding-sibling::text()"
S>сделать как-то так
S>"/Project/Targets/Target/Groups[Group/string(GroupName)=$name]/Files::text()"

S>Т.е. явно выбирать Grops/Files, но в таких Groups, у которых есть child Group с нужным условием. Не уверен за решение, вообще не знаю XPath.



Group с условием выбрать — не проблема. Можно и отдельные файлы выбирать в Files.

проблема найти ноду типа text непосредственно перед нужным Group
Маньяк Робокряк колесит по городу
Re[5]: А про XPath вопросы в какой форум задавать?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 07.03.18 01:46
Оценка:
Здравствуйте, Marty, Вы писали:

M>проблема найти ноду типа text непосредственно перед нужным Group

Значит, неверно понял задачу.
Re: А про XPath вопросы в какой форум задавать?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 08.03.18 01:18
Оценка:
Здравствуйте, Marty, Вы писали:

M>Сабж, собственно.


Нашел ничегошный онлайн тестер XPath выражений — http://www.utilities-online.info/xpath/
Мой сэмпл — /Project/Targets/Target/Groups/Group[string(GroupName)='github_misc_stm32_meekdai_stm32_grbl']/preceding-sibling::node() — работает норм

Я затупил, функция text() — вроде как возвращает чисто текст узла, как строку, а мне нужно было node(). При использовании text() все перепробованные онлайн экзекьюторы либо ругались, либо пустоту возвращали.
С node() мой парсер отрабатывал и раньше, только возвращал предыдущий именно что тэг, игнорируя узлы атрибутов, текстовые узлы и тп. Пришлось немного допилить, старое поведение оставил как есть опцию, работающую с установленным флагом (благо нигде в таком виде не использовал вроде), а новое поведение, которое все узлы хавает, сделал по дефолту. Вроде работает, всем спасибо
Маньяк Робокряк колесит по городу
Re[2]: А про XPath вопросы в какой форум задавать?
От: · Великобритания  
Дата: 08.03.18 10:51
Оценка:
Здравствуйте, Marty, Вы писали:

M>>Сабж, собственно.

M>Нашел ничегошный онлайн тестер XPath выражений — http://www.utilities-online.info/xpath/
M>Мой сэмпл — /Project/Targets/Target/Groups/Group[string(GroupName)='github_misc_stm32_meekdai_stm32_grbl']/preceding-sibling::node() — работает норм
M>Я затупил, функция text() — вроде как возвращает чисто текст узла, как строку, а мне нужно было node(). При использовании text() все перепробованные онлайн экзекьюторы либо ругались, либо пустоту возвращали.
M>С node() мой парсер отрабатывал и раньше, только возвращал предыдущий именно что тэг, игнорируя узлы атрибутов, текстовые узлы и тп. Пришлось немного допилить, старое поведение оставил как есть опцию, работающую с установленным флагом (благо нигде в таком виде не использовал вроде), а новое поведение, которое все узлы хавает, сделал по дефолту. Вроде работает, всем спасибо
Что-то странно. text() — матчит узлы с типом "текст", а node() — все узлы. "Чисто текст" — это функция string().
Попробовал этот онлайн тестер для
<Groups>
xx<booo/>

    <Group>
        <GroupName>github_misc_stm32_meekdai_stm32_grbl</GroupName>
    </Group>
</Groups>

выражение
/Groups/Group[string(GroupName)='github_misc_stm32_meekdai_stm32_grbl']/preceding-sibling::text()[1]

и Return type: "Nodeset" выдало ровно то, что тебе нужно
[#text: 

    ]

Без [1] выдало
[#text: 
xx]
[#text: 

    ]

node() вместо text() выдало
[#text: 
xx]
[booo: null]
[#text: 

    ]

Всё верно.
По-моему ты что-то недоговаривашеь.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: А про XPath вопросы в какой форум задавать?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 08.03.18 14:25
Оценка:
Здравствуйте, ·, Вы писали:

·>Здравствуйте, Marty, Вы писали:


M>>>Сабж, собственно.

M>>Нашел ничегошный онлайн тестер XPath выражений — http://www.utilities-online.info/xpath/
M>>Мой сэмпл — /Project/Targets/Target/Groups/Group[string(GroupName)='github_misc_stm32_meekdai_stm32_grbl']/preceding-sibling::node() — работает норм
M>>Я затупил, функция text() — вроде как возвращает чисто текст узла, как строку, а мне нужно было node(). При использовании text() все перепробованные онлайн экзекьюторы либо ругались, либо пустоту возвращали.
M>>С node() мой парсер отрабатывал и раньше, только возвращал предыдущий именно что тэг, игнорируя узлы атрибутов, текстовые узлы и тп. Пришлось немного допилить, старое поведение оставил как есть опцию, работающую с установленным флагом (благо нигде в таком виде не использовал вроде), а новое поведение, которое все узлы хавает, сделал по дефолту. Вроде работает, всем спасибо
·>Что-то странно. text() — матчит узлы с типом "текст", а node() — все узлы. "Чисто текст" — это функция string().

Значит, я неправильно спецификацию XPath 1.0 вычитал, когда писал парсер. У меня text() выдает текст, а при тесте я что-то напутал
Маньяк Робокряк колесит по городу
Re[4]: А про XPath вопросы в какой форум задавать?
От: · Великобритания  
Дата: 08.03.18 15:58
Оценка:
Здравствуйте, Marty, Вы писали:

M>·>Что-то странно. text() — матчит узлы с типом "текст", а node() — все узлы. "Чисто текст" — это функция string().

M>Значит, я неправильно спецификацию XPath 1.0 вычитал,
Нет, это так называемый Node Test https://www.w3.org/TR/1999/REC-xpath-19991116/#node-tests

M>когда писал парсер. У меня text() выдает текст, а при тесте я что-то напутал

Я не понял — парсер чего? У тебя самодельная имплементация xpath что-ли?!
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: А про XPath вопросы в какой форум задавать?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 08.03.18 17:15
Оценка:
Здравствуйте, ·, Вы писали:

M>>·>Что-то странно. text() — матчит узлы с типом "текст", а node() — все узлы. "Чисто текст" — это функция string().

M>>Значит, я неправильно спецификацию XPath 1.0 вычитал,
·>Нет, это так называемый Node Test https://www.w3.org/TR/1999/REC-xpath-19991116/#node-tests

Хм, странно, то ли я что-то другое читал, то ли не так вычитал
Давно дело было


M>>когда писал парсер. У меня text() выдает текст, а при тесте я что-то напутал

·>Я не понял — парсер чего? У тебя самодельная имплементация xpath что-ли?!

Да, самодельная
Маньяк Робокряк колесит по городу
Re: А про XPath вопросы в какой форум задавать?
От: Mr.Delphist  
Дата: 19.03.18 14:41
Оценка:
Здравствуйте, Marty, Вы писали:

Есть такой форум:
https://rsdn.org/forum/xml/

Админы тему перенесут.
Re[2]: А про XPath вопросы в какой форум задавать?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 19.03.18 18:03
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:


MD>Есть такой форум:

MD>https://rsdn.org/forum/xml/

Спасибо. Что-то я его не приметил
Маньяк Робокряк колесит по городу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.