Вычисление и отладка выражений XPath

16.08.19

Разработка - Инструментарий разработчика

Обработка позволяет производить отладку выражений XPath на произвольном документе. Простой и понятный инструмент, который делает то, что нужно без лишних сложностей. Позволяет быстро проверить как вычисляется выражение XPath относительно любого из узлов исходного документа.

Скачать файлы

Наименование Файл Версия Размер
Обработка вычисления выражений XPath
.epf 11,29Kb
155
.epf 11,29Kb 155 Скачать

Поводом к написанию обработки стала необходимость отладить выражение XPath, которое должно было вычисляться относительно узла, расположенного где-то в середине большого файла. К моему удивлению, адекватных бесплатных средств работы с XML, которые бы позволили это сделать - нет.

Все те утилиты, которые удалось найти делали это либо плохо, либо не так, как надо. Нужный функционал был в платном пакете XML Spy, однако, даже там нужно было писать весь путь от начала документа. Мне же нужно было проверить выражение относительно середины документа....Frown

В результате, получилась данная обработка. Возможности:

  • Быстро и просто подготовить отладку выражения - вставить XML текст, ввести выражение, выполнить.
  • Отображает результат выражения в виде дерева узлов. Все узлы, попавшие в результат выражения визуализируются.
  • Позволяет узнать текущий путь в документе для любого узла. То есть, для любого узла можем получить его путь в виде "/parent/parent[2]/child[3]"
  • Позволяет вычислять выражение относительно произвольного контекста. Например, есть длинный документ, в середине которого есть узел, на котором вам нужно вычислить выражение. Порядок действий:
  • 1. Вычисляем выражение "/" и получаем визуальное дерево документа (выполнять п.1 необязательно, можно писать сразу выражение)
  • 2. Переходим в дереве на нужный узел и устанавливаем его в качестве текущего
  • 3. Пишем выражение относительно текущего узла, а не от корня документа, как в большинстве аналогов
  • 4. Наслаждаемся

При просмотре дерева используется динамический выбор узлов DOM, т.е. дерево результата не строится целиком, а экономит память и отображает узлы по мере необходимости.
 

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122177    670    389    

714

SALE! 25%

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 15300 руб.

06.10.2023    7297    21    6    

39

SALE! 20%

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 8000 руб.

10.11.2023    3544    11    1    

34

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2520 руб.

14.01.2013    177758    1073    0    

849

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99348    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18116    6    8    

39

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28111    3    10    

15

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23605    15    15    

32
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. kilokilo 18 31.10.12 03:38 Сейчас в теме
2. German 413 31.10.12 08:53 Сейчас в теме
Я XMLSрy использую, но + за стремление
4. unknownDaemon 44 18.11.12 14:58 Сейчас в теме
(2) German, XMLSpy оно ж не одинэсовское вроде? Просто какбэ реализации 1С разновсяческих API весьма своеобразное… Наталкивался на непонимания ряда функций и чудеса синтаксиса… Так-что лучше отладку делать нативно ;-)

ЗЫ Еще бы регэкспы добавили нативно внутря — цены бы платформк не было ;-)
3. unknownDaemon 44 18.11.12 14:52 Сейчас в теме
Люто плюсанул :) Но позволил себе наглость чуть-чуть добавить функционала :) Скрин и результат прилагаю…
Теперь можно и имеет смысл юзать почти все что угодно из вот этого набора например…

То есть, результат такой конструкции: ceiling(sum(//Товары//Сумма)) max(//Товары//Количество) можно увидеть в соответсвующем поле при выборе ТипРезультата=ТипРезультатаDOMXPath.Число … ну и с остальными вариантами также ;-)

ЗЫ Еще раз спасибо за проделанный труд!
Прикрепленные файлы:
ОтладкаXPath.epf
Evil Beaver; CSiER; i_lo; +3 Ответить
5. xzorkiix 34 12.07.13 10:45 Сейчас в теме
(0) у меня вопрос это проблема реализации xpath в 1С, или ЧЯДНТ?

Пытаюсь выбрать все элементы Acceptance для которых подчиненный элемент имеет необходимый текст (значение).

xpath выражение не отрабатывает в обработке (8.2)


но работает в другом инструменте корректно (notepad++)


UPD: Запрос /soap:Envelope[soap:Header="test"] работает. Скорее всего что-то связано с namespace атрибутов.
6. Evil Beaver 8107 12.07.13 11:10 Сейчас в теме
(5) xzorkiix, из скриншотов не видно - на что маппится префикс "m:". Соответствие префиксов и URI настраивается на второй закладке. Возможно, notepad++ умеет это делать сам.
7. xzorkiix 34 12.07.13 11:19 Сейчас в теме
(6) я выше подправил, вижу что для soap: который по умолчанию занесен в файл всё ок.

Все возможные ns в xml

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>test</soap:Header>
<soap:Body> <m:GetAcceptanceListResponse xmlns:m="urn:wss2/1SESL/1.0">
<m:return xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Acceptance xmlns="urn:wss2/Integration/1.0">

Попробовал и вторую вкладку раскидать, но видимо ещё мимо. Не нужно ли здесь использовать Фабрику XDTO? (как в случае сервиса)

8. Evil Beaver 8107 12.07.13 11:26 Сейчас в теме
(7) xzorkiix, нет, фабрика не нужна. Если дадите сам файл и искомое выражение, могу посмотреть, но вечером.
аааа... стоп-стоп... похоже понял

У вас "пустой" префикс задан для пространства по умолчанию. в XPath по стандарту пустые префиксы не прокатывают. Назовите его как-нибудь, скажем "t" и все узлы "без префиксов" в выражении адресуйте, как "t:"
9. xzorkiix 34 12.07.13 11:57 Сейчас в теме
(8) Пустое, это уже была попытка угадать. Под фабрикой я понимал Пакет XDTO (это тоже была попытка угадать). Буду смотреть файл, если будут вопросы - побеспокою. А в целом ваше предположение мне кажется верным (о том что необходимо присвоить префикс всем вхождениям, где я произвожу поиск).

Спасибо.
10. Evil Beaver 8107 12.07.13 13:01 Сейчас в теме
(9) xzorkiix, это не просто предположение, а уже набитая шишка. Пустые префиксы не канают и это не глюк, а фича XPath.
11. xzorkiix 34 12.07.13 14:57 Сейчас в теме
(10) Перебрал имеющуюся строку XML с принудительной расстановкой префиксов ns в имени элементов. Взлетело.



Префиксы = Новый Соответствие;

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("UTF-8");

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ТекстовыйДокумент.ПолучитьТекст());
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла=ТипУзлаXML.НачалоЭлемента Тогда

Префикс = Префиксы.Получить(ЧтениеXML.URIПространстваИмен);
Если Префикс = Неопределено Тогда
Префикс = "myns" + Формат(Префиксы.Количество()+1,"ЧГ=");
Префиксы.Вставить(ЧтениеXML.URIПространстваИмен, Префикс);
конецЕсли;

ЗаписьXML.ЗаписатьНачалоЭлемента(Префикс + ":" + ЧтениеXML.ЛокальноеИмя);
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен(Префикс, ЧтениеXML.URIПространстваИмен);

ИначеЕсли ЧтениеXML.ТипУзла=ТипУзлаXML.Текст Тогда
ЗаписьXML.ЗаписатьТекст(ЧтениеXML.Значение);
ИначеЕсли ЧтениеXML.ТипУзла=ТипУзлаXML.КонецЭлемента Тогда
ЗаписьXML.ЗаписатьКонецЭлемента();
ИначеЕсли ЧтениеXML.ТипУзла=ТипУзлаXML.ОбъявлениеXML Тогда
ЗаписьXML.ЗаписатьОбъявлениеXML();
КонецЕсли;
КонецЦикла;

Сообщить(ЗаписьXML.Закрыть());


PS Закладку с ns не трогал, как есть

12. Evil Beaver 8107 12.07.13 16:34 Сейчас в теме
(11) xzorkiix, нужно было наоборот.
1. Исходный текст имеет пространство по-умолчанию, скажем, Х (икс), и все узлы записаны без префиксов
2. На закладке пространства имен для Х указываем некий произвольный префикс, скажем, х(икс).
3. В выражении XPath обращаемся к узлам, которые без префиксов, через префикс х(икс), указанный на закладке
4. PROFIT. исходный XML не модифицируем, он идет, как есть.

т.е. у вас в файле <Узел>, а в выражении - x:Узел
13. xzorkiix 34 18.07.13 11:39 Сейчас в теме
(12)[посыпает голову пеплом]. Спасибо.
22. xzorkiix 34 24.10.13 14:51 Сейчас в теме
(12)Evil Beaver,

Вернулся к XPath, прибег к рекомендации из (12). Всё так и есть.

Может кому будет полезно

На примере
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
<edmx:DataServices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" m:DataServiceVersion="1.0">
<Schema Namespace="Microsoft.SharePoint.DataService" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://schemas.microsoft.com/ado/2007/05/edm">
<EntityType Name="AttachmentsItem" m:HasStream="true">
<Key>
<PropertyRef Name="EntitySet" />
<PropertyRef Name="ItemId" />
<PropertyRef Name="Name" />
</Key>
<Property Name="EntitySet" Type="Edm.String" Nullable="false" />
<Property Name="ItemId" Type="Edm.Int32" Nullable="false" />
<Property Name="Name" Type="Edm.String" Nullable="false" m:FC_TargetPath="SyndicationTitle" m:FC_ContentKind="text" m:FC_KeepInContent="true" />
</EntityType>
</Schema>
</edmx:DataServices>
</edmx:Edmx>
Показать


Поиск через выражение /edmx:Edmx/edmx:DataServices[1]/Schema[1]/EntityType[1] не даёт ожидаемого результата (результат пустой).

Добавляем на вкладке "Соответствие.." пару
Префикс emn URI http://schemas.microsoft.com/ado/2007/05/edm

Выражение корректируем, как /edmx:Edmx/edmx:DataServices[1]/edm:Schema[1]/edm:EntityType[1]

Получаем в ответе - требуемый узел. PROFIT

Немного подправил функцию ВычислитьПредставлениеТекущегоПути при формировании пути не было требуемых префиксов (из таблицы "Соответствия.."). В моем случае работает корректно

Функция ВычислитьПредставлениеТекущегоПути(Знач ТекущийУзел)

// <-- xzorkiix
#Если НЕ (Клиент Или Сервер Или ВнешнееСоединение) Тогда
DOM = Новый ДокументDOM();
ТекущийУзел = DOM.ЭлементДокумента; // ЭлементDOM (DOMElement)
#КонецЕсли
// -->

Если ТекущийУзел.РодительскийУзел <> Неопределено Тогда

Если ТекущийУзел.ТипУзла = ТипУзлаDOM.Элемент Тогда
Если ТекущийУзел = мДокументDOM.ЭлементДокумента Тогда
ИмяУзла = ТекущийУзел.ИмяУзла;
Иначе

СчетчикСоседей = 0;
СоседнийУзел = ТекущийУзел.ПредыдущийСоседний;
Пока СоседнийУзел <> Неопределено Цикл
СчетчикСоседей = СчетчикСоседей + 1;
СоседнийУзел = СоседнийУзел.ПредыдущийСоседний;
КонецЦикла;

ИмяУзла = ТекущийУзел.ИмяУзла + "[" + (СчетчикСоседей+1) + "]";

КонецЕсли;
ИначеЕсли ТекущийУзел.ТипУзла = ТипУзлаDOM.Текст Тогда
ИмяУзла = "text()";
Иначе
ИмяУзла = ТекущийУзел.ИмяУзла;
КонецЕсли;

// <-- xzorkiix
// Подберем префикс из СоответствияПространствИмен
Если ПустаяСтрока(ТекущийУзел.Префикс) Тогда

ЗаписьСоответствияПространствИмен = СоответствияПространствИмен.Найти(
ТекущийУзел.URIПространстваИмен, "ПространствоИмен");

Если ЗаписьСоответствияПространствИмен <> Неопределено
И Не ПустаяСтрока(ЗаписьСоответствияПространствИмен.Префикс) Тогда
ИмяУзла = ЗаписьСоответствияПространствИмен.Префикс + ":" + ИмяУзла;
КонецЕсли;

КонецЕсли;
// -->

Возврат ВычислитьПредставлениеТекущегоПути(ТекущийУзел.РодительскийУзел) + "/" + ИмяУзла;

Иначе
Если ТекущийУзел.ТипУзла = ТипУзлаDOM.Документ Тогда
Возврат "";
ИначеЕсли ТекущийУзел.ТипУзла = ТипУзлаDOM.Атрибут Тогда
Возврат ВычислитьПредставлениеТекущегоПути(ТекущийУзел.ЭлементВладелец)
+ "/@" + ТекущийУзел.ИмяУзла;
Иначе
Возврат ТекущийУзел.ИмяУзла;
КонецЕсли;
КонецЕсли;

КонецФункции
artbear; Evil Beaver; +2 Ответить
14. Поручик 4670 04.09.13 15:57 Сейчас в теме
(5) Для notepad++ какой-то плагин? В самом редакторе на нашёл, в XML Tools тоже нет похожего.
15. Evil Beaver 8107 04.09.13 19:58 Сейчас в теме
(14) Поручик, тоже не вижу плагина...
16. Поручик 4670 04.09.13 20:52 Сейчас в теме
(15) Нашёл. xpatherizernpp. XML XPath Query Analyzer Plugin for NotePad ++. https://code.google.com/p/xpatherizernpp/
17. Поручик 4670 05.09.13 00:00 Сейчас в теме
(15) Ещё до кучи в качестве закладки
XPather
...generates XPaths while browsing or inspecting HTML/XML/*ML documents; evaluates your XPaths and inspects the results; extracts the content.
http://xpath.alephzarro.com/
18. Evil Beaver 8107 05.09.13 09:37 Сейчас в теме
(17) Поручик, не ставил пока, спрошу: а они умеют вычислять не относительно начала документа, а относительно произольного узла?
19. Поручик 4670 05.09.13 11:04 Сейчас в теме
(18) В плагине для notepad++ понятия произвольного узла нет. И другой момент, если для документа установлена кодировка UTF-XX, то он плохо работает с кириллическими названиями тэгов, атрибутов, текстовым содержимым. Надо переключаться в режим ANSI.
20. Evil Beaver 8107 09.09.13 20:38 Сейчас в теме
(19) Поручик, тогда фтопку плагин, моя обработка рулит! ;)
21. Поручик 4670 09.09.13 20:48 Сейчас в теме
(20) Я пользуюсь обеими средствами. У тебя не сохраняется сам текст xml и нет возможности загрузить из файла. Могу и сам сделать, но лень. Зато в плагине не сохраняется выражение Xpath. Кстати, рекомендую сохранять историю выражений в списке выбора.
Я бы сделал, но ту свою задачу выполнил и уже особо не интересно.
Evil Beaver; +1 Ответить
23. Evil Beaver 8107 24.10.13 16:38 Сейчас в теме
(21) Поручик, да, история выражения и сохранение нужны. Недавно тоже XPath-ил с помощью обработки и их не хватало. Но, как ты выразился, сделать лень.
24. Yashazz 4709 21.05.14 20:47 Сейчас в теме
(23) Я с истории практически начал, в своей обработке, да и в текст её вываливать там можно. И сохранение тоже потребовалось сразу. А вот с пространствами имён даже заморачиваться не стал. Думал ещё точку начала поиска сделать изменяемой, но так и не освоил дзен, как заставить это работать без ошибки несоответствия.
25. Evil Beaver 8107 22.05.14 13:27 Сейчас в теме
(24) Yashazz, просто без пространств имен вроде как XPath не работает, или я что-то путаю?
Если есть файл с ПИ по умолчанию (т.е без префикса), то выражение ничего не найдет. Пример:

<root xmlns="http://someURI.com">
<elem>куку</elem>
</root>

Выражение /root/elem ничего не найдет, ибо XPath процессору нужен префикс для http://someURI.com. Это соответствие как раз для такого обхода - в файле без префиксов, а в выражении с префиксами: /ns:root/ns:elem. Соответствие префиксов у вас отсутствует и подобный файл обработать с помощью XPath не получится. Возможно, я что-то уже и путаю на старости лет, не уверен на 100%
26. NAlex 6 08.06.18 15:03 Сейчас в теме
Зря скачал.
В заголовке написано: "Обработка позволяет производить отладку выражений XPath на произвольном документе".
Скачал, вставил документ HTML обработка выдает ошибку, что открывающих тегов более 1, получается, что обработка работает не с "произвольными документами", а с документами XML.
Надо бы дизинформацию из заголовка убрать.
27. user774630 08.06.18 17:57 Сейчас в теме
(26)
https://ru.wikipedia.org/wiki/XPath
XPath (XML Path Language) — язык запросов к элементам XML-документа.


А че картинку не засунул?
28. Evil Beaver 8107 09.06.18 18:45 Сейчас в теме
(26) Честно говоря, и в голову не пришло, что кто-то захочет применять XPath для обработки HTML. Под словом "документ" понимается документ XML. Дезинформации здесь не вижу.
ixijixi; user774630; +2 Ответить
29. VVi3ard 52 10.11.20 14:54 Сейчас в теме
(0) В статье упоминается:

"При просмотре дерева используется динамический выбор узлов DOM, т.е. дерево результата не строится целиком, а экономит память и отображает узлы по мере необходимости."

Хотел использовать xpath для работы с файлами ГАР (замена ФИАС) но там есть файлы, по 1-2,5 гб.
По большому счёту там достаточно простая струкутра, нужно находить узел по значению свойства ObjectID.

Можете в общих чертах описать как работает экономия памяти?
30. Evil Beaver 8107 16.11.20 15:23 Сейчас в теме
(29) Там речь шла о дереве результата вычисления выражения на форме. Сам файл для работы XPath все равно будет прочитан целиком.
31. TheOldGuard 10 20.04.23 11:08 Сейчас в теме
Не очень понял, момент представления дерева, или это нормальный пример выдачи элементов XML дерева?

Значение переменной сред я так понял, вы определяете путем использования префикса для первого xmlns

UPD: Заметил, что выделяя объект (красный цвет) зацепил дополнительно еще и второй, речь идёт о первом
Прикрепленные файлы:
Оставьте свое сообщение