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

16.08.19

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Обработка вычисления выражений XPath
.epf 11,29Kb
155
155 Скачать (2 SM) Купить за 2 150 руб.

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

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

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

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

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

См. также

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

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

12000 руб.

02.09.2020    171329    959    403    

923

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

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    13851    107    46    

107

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

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

22200 руб.

06.10.2023    17176    43    15    

75

Инструментарий разработчика Программист Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    27142    94    48    

136

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

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

15000 руб.

10.11.2023    11823    44    27    

67

SALE! %

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

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

4800 3840 руб.

14.01.2013    191055    1152    0    

919

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

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    1075    2    0    

5

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

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

5000 руб.

07.02.2018    104082    244    100    

307
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 35 12.07.13 10:45 Сейчас в теме
(0) у меня вопрос это проблема реализации xpath в 1С, или ЧЯДНТ?

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

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


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


UPD: Запрос /soap:Envelope[soap:Header="test"] работает. Скорее всего что-то связано с namespace атрибутов.
6. Evil Beaver 8262 12.07.13 11:10 Сейчас в теме
(5) xzorkiix, из скриншотов не видно - на что маппится префикс "m:". Соответствие префиксов и URI настраивается на второй закладке. Возможно, notepad++ умеет это делать сам.
7. xzorkiix 35 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 8262 12.07.13 11:26 Сейчас в теме
(7) xzorkiix, нет, фабрика не нужна. Если дадите сам файл и искомое выражение, могу посмотреть, но вечером.
аааа... стоп-стоп... похоже понял

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

Спасибо.
10. Evil Beaver 8262 12.07.13 13:01 Сейчас в теме
(9) xzorkiix, это не просто предположение, а уже набитая шишка. Пустые префиксы не канают и это не глюк, а фича XPath.
11. xzorkiix 35 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 8262 12.07.13 16:34 Сейчас в теме
(11) xzorkiix, нужно было наоборот.
1. Исходный текст имеет пространство по-умолчанию, скажем, Х (икс), и все узлы записаны без префиксов
2. На закладке пространства имен для Х указываем некий произвольный префикс, скажем, х(икс).
3. В выражении XPath обращаемся к узлам, которые без префиксов, через префикс х(икс), указанный на закладке
4. PROFIT. исходный XML не модифицируем, он идет, как есть.

т.е. у вас в файле <Узел>, а в выражении - x:Узел
13. xzorkiix 35 18.07.13 11:39 Сейчас в теме
(12)[посыпает голову пеплом]. Спасибо.
22. xzorkiix 35 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. Поручик 4661 04.09.13 15:57 Сейчас в теме
(5) Для notepad++ какой-то плагин? В самом редакторе на нашёл, в XML Tools тоже нет похожего.
15. Evil Beaver 8262 04.09.13 19:58 Сейчас в теме
(14) Поручик, тоже не вижу плагина...
16. Поручик 4661 04.09.13 20:52 Сейчас в теме
(15) Нашёл. xpatherizernpp. XML XPath Query Analyzer Plugin for NotePad ++. https://code.google.com/p/xpatherizernpp/
17. Поручик 4661 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 8262 05.09.13 09:37 Сейчас в теме
(17) Поручик, не ставил пока, спрошу: а они умеют вычислять не относительно начала документа, а относительно произольного узла?
19. Поручик 4661 05.09.13 11:04 Сейчас в теме
(18) В плагине для notepad++ понятия произвольного узла нет. И другой момент, если для документа установлена кодировка UTF-XX, то он плохо работает с кириллическими названиями тэгов, атрибутов, текстовым содержимым. Надо переключаться в режим ANSI.
20. Evil Beaver 8262 09.09.13 20:38 Сейчас в теме
(19) Поручик, тогда фтопку плагин, моя обработка рулит! ;)
21. Поручик 4661 09.09.13 20:48 Сейчас в теме
(20) Я пользуюсь обеими средствами. У тебя не сохраняется сам текст xml и нет возможности загрузить из файла. Могу и сам сделать, но лень. Зато в плагине не сохраняется выражение Xpath. Кстати, рекомендую сохранять историю выражений в списке выбора.
Я бы сделал, но ту свою задачу выполнил и уже особо не интересно.
Evil Beaver; +1 Ответить
23. Evil Beaver 8262 24.10.13 16:38 Сейчас в теме
(21) Поручик, да, история выражения и сохранение нужны. Недавно тоже XPath-ил с помощью обработки и их не хватало. Но, как ты выразился, сделать лень.
24. Yashazz 4804 21.05.14 20:47 Сейчас в теме
(23) Я с истории практически начал, в своей обработке, да и в текст её вываливать там можно. И сохранение тоже потребовалось сразу. А вот с пространствами имён даже заморачиваться не стал. Думал ещё точку начала поиска сделать изменяемой, но так и не освоил дзен, как заставить это работать без ошибки несоответствия.
25. Evil Beaver 8262 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 8262 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 8262 16.11.20 15:23 Сейчас в теме
(29) Там речь шла о дереве результата вычисления выражения на форме. Сам файл для работы XPath все равно будет прочитан целиком.
31. TheOldGuard 12 20.04.23 11:08 Сейчас в теме
Не очень понял, момент представления дерева, или это нормальный пример выдачи элементов XML дерева?

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

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