Обработка позволяет производить отладку выражений XPath на произвольном документе. Простой и понятный инструмент, который делает то, что нужно без лишних сложностей.
Позволяет быстро проверить как вычисляется выражение XPath относительно любого из узлов исходного документа.
Скачать файл
ВНИМАНИЕ:
Файлы из Базы знаний - это исходный код разработки.
Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы.
Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных.
Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Поводом к написанию обработки стала необходимость отладить выражение XPath, которое должно было вычисляться относительно узла, расположенного где-то в середине большого файла. К моему удивлению, адекватных бесплатных средств работы с XML, которые бы позволили это сделать - нет.
Все те утилиты, которые удалось найти делали это либо плохо, либо не так, как надо. Нужный функционал был в платном пакете XML Spy, однако, даже там нужно было писать весь путь от начала документа. Мне же нужно было проверить выражение относительно середины документа....
В результате, получилась данная обработка. Возможности:
Быстро и просто подготовить отладку выражения - вставить XML текст, ввести выражение, выполнить.
Отображает результат выражения в виде дерева узлов. Все узлы, попавшие в результат выражения визуализируются.
Позволяет узнать текущий путь в документе для любого узла. То есть, для любого узла можем получить его путь в виде "/parent/parent[2]/child[3]"
Позволяет вычислять выражение относительно произвольного контекста. Например, есть длинный документ, в середине которого есть узел, на котором вам нужно вычислить выражение. Порядок действий:
1. Вычисляем выражение "/" и получаем визуальное дерево документа (выполнять п.1 необязательно, можно писать сразу выражение)
2. Переходим в дереве на нужный узел и устанавливаем его в качестве текущего
3. Пишем выражение относительно текущего узла, а не от корня документа, как в большинстве аналогов
4. Наслаждаемся
При просмотре дерева используется динамический выбор узлов DOM, т.е. дерево результата не строится целиком, а экономит память и отображает узлы по мере необходимости.
Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.
Решение в Реестре отечественного ПО
Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.
Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.
Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.
Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.
Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!
(2) German, XMLSpy оно ж не одинэсовское вроде? Просто какбэ реализации 1С разновсяческих API весьма своеобразное… Наталкивался на непонимания ряда функций и чудеса синтаксиса… Так-что лучше отладку делать нативно ;-)
ЗЫ Еще бы регэкспы добавили нативно внутря — цены бы платформк не было ;-)
Люто плюсанул :) Но позволил себе наглость чуть-чуть добавить функционала :) Скрин и результат прилагаю…
Теперь можно и имеет смысл юзать почти все что угодно из вот этого набора например…
То есть, результат такой конструкции: ceiling(sum(//Товары//Сумма)) max(//Товары//Количество) можно увидеть в соответсвующем поле при выборе ТипРезультата=ТипРезультатаDOMXPath.Число … ну и с остальными вариантами также ;-)
(5) xzorkiix, из скриншотов не видно - на что маппится префикс "m:". Соответствие префиксов и URI настраивается на второй закладке. Возможно, notepad++ умеет это делать сам.
(7) xzorkiix, нет, фабрика не нужна. Если дадите сам файл и искомое выражение, могу посмотреть, но вечером.
аааа... стоп-стоп... похоже понял
У вас "пустой" префикс задан для пространства по умолчанию. в XPath по стандарту пустые префиксы не прокатывают. Назовите его как-нибудь, скажем "t" и все узлы "без префиксов" в выражении адресуйте, как "t:"
(8) Пустое, это уже была попытка угадать. Под фабрикой я понимал Пакет XDTO (это тоже была попытка угадать). Буду смотреть файл, если будут вопросы - побеспокою. А в целом ваше предположение мне кажется верным (о том что необходимо присвоить префикс всем вхождениям, где я произвожу поиск).
ЧтениеXML =Новый ЧтениеXML; ЧтениеXML.УстановитьСтроку(ТекстовыйДокумент.ПолучитьТекст()); Пока ЧтениеXML.Прочитать()Цикл
Если ЧтениеXML.ТипУзла=ТипУзлаXML.НачалоЭлемента Тогда
Префикс = Префиксы.Получить(ЧтениеXML.URIПространстваИмен); Если Префикс = Неопределено Тогда
Префикс ="myns"+ Формат(Префиксы.Количество()+1,"ЧГ="); Префиксы.Вставить(ЧтениеXML.URIПространстваИмен, Префикс); конецЕсли;
ИначеЕсли ЧтениеXML.ТипУзла=ТипУзлаXML.Текст Тогда
ЗаписьXML.ЗаписатьТекст(ЧтениеXML.Значение); ИначеЕсли ЧтениеXML.ТипУзла=ТипУзлаXML.КонецЭлемента Тогда
ЗаписьXML.ЗаписатьКонецЭлемента(); ИначеЕсли ЧтениеXML.ТипУзла=ТипУзлаXML.ОбъявлениеXML Тогда
ЗаписьXML.ЗаписатьОбъявлениеXML(); КонецЕсли; КонецЦикла;
(11) xzorkiix, нужно было наоборот.
1. Исходный текст имеет пространство по-умолчанию, скажем, Х (икс), и все узлы записаны без префиксов
2. На закладке пространства имен для Х указываем некий произвольный префикс, скажем, х(икс).
3. В выражении XPath обращаемся к узлам, которые без префиксов, через префикс х(икс), указанный на закладке
4. PROFIT. исходный XML не модифицируем, он идет, как есть.
Выражение корректируем, как /edmx:Edmx/edmx:DataServices[1]/edm:Schema[1]/edm:EntityType[1]
Получаем в ответе - требуемый узел. PROFIT
Немного подправил функцию ВычислитьПредставлениеТекущегоПути при формировании пути не было требуемых префиксов (из таблицы "Соответствия.."). В моем случае работает корректно
Функция ВычислитьПредставлениеТекущегоПути(Знач ТекущийУзел)
// <-- xzorkiix
#Если НЕ (Клиент Или Сервер Или ВнешнееСоединение) Тогда
DOM =Новый ДокументDOM(); ТекущийУзел = DOM.ЭлементДокумента;// ЭлементDOM (DOMElement)
#КонецЕсли
// -->
Если ТекущийУзел.РодительскийУзел <> Неопределено Тогда
Если ТекущийУзел.ТипУзла = ТипУзлаDOM.Элемент Тогда
Если ТекущийУзел = мДокументDOM.ЭлементДокумента Тогда
ИмяУзла = ТекущийУзел.ИмяУзла; Иначе
СчетчикСоседей =0; СоседнийУзел = ТекущийУзел.ПредыдущийСоседний; Пока СоседнийУзел <> Неопределено Цикл
СчетчикСоседей = СчетчикСоседей +1; СоседнийУзел = СоседнийУзел.ПредыдущийСоседний; КонецЦикла;
Если ЗаписьСоответствияПространствИмен <> Неопределено
И Не ПустаяСтрока(ЗаписьСоответствияПространствИмен.Префикс)Тогда ИмяУзла = ЗаписьСоответствияПространствИмен.Префикс +":"+ ИмяУзла; КонецЕсли;
Иначе
Если ТекущийУзел.ТипУзла = ТипУзлаDOM.Документ Тогда
Возврат ""; ИначеЕсли ТекущийУзел.ТипУзла = ТипУзлаDOM.Атрибут Тогда
Возврат ВычислитьПредставлениеТекущегоПути(ТекущийУзел.ЭлементВладелец) +"/@"+ ТекущийУзел.ИмяУзла; Иначе
Возврат ТекущийУзел.ИмяУзла; КонецЕсли; КонецЕсли;
(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) В плагине для notepad++ понятия произвольного узла нет. И другой момент, если для документа установлена кодировка UTF-XX, то он плохо работает с кириллическими названиями тэгов, атрибутов, текстовым содержимым. Надо переключаться в режим ANSI.
(20) Я пользуюсь обеими средствами. У тебя не сохраняется сам текст xml и нет возможности загрузить из файла. Могу и сам сделать, но лень. Зато в плагине не сохраняется выражение Xpath. Кстати, рекомендую сохранять историю выражений в списке выбора.
Я бы сделал, но ту свою задачу выполнил и уже особо не интересно.
(23) Я с истории практически начал, в своей обработке, да и в текст её вываливать там можно. И сохранение тоже потребовалось сразу. А вот с пространствами имён даже заморачиваться не стал. Думал ещё точку начала поиска сделать изменяемой, но так и не освоил дзен, как заставить это работать без ошибки несоответствия.
(24) Yashazz, просто без пространств имен вроде как XPath не работает, или я что-то путаю?
Если есть файл с ПИ по умолчанию (т.е без префикса), то выражение ничего не найдет. Пример:
Выражение /root/elem ничего не найдет, ибо XPath процессору нужен префикс для http://someURI.com. Это соответствие как раз для такого обхода - в файле без префиксов, а в выражении с префиксами: /ns:root/ns:elem. Соответствие префиксов у вас отсутствует и подобный файл обработать с помощью XPath не получится. Возможно, я что-то уже и путаю на старости лет, не уверен на 100%
Зря скачал.
В заголовке написано: "Обработка позволяет производить отладку выражений XPath на произвольном документе".
Скачал, вставил документ HTML обработка выдает ошибку, что открывающих тегов более 1, получается, что обработка работает не с "произвольными документами", а с документами XML.
Надо бы дизинформацию из заголовка убрать.
(26) Честно говоря, и в голову не пришло, что кто-то захочет применять XPath для обработки HTML. Под словом "документ" понимается документ XML. Дезинформации здесь не вижу.
"При просмотре дерева используется динамический выбор узлов DOM, т.е. дерево результата не строится целиком, а экономит память и отображает узлы по мере необходимости."
Хотел использовать xpath для работы с файлами ГАР (замена ФИАС) но там есть файлы, по 1-2,5 гб.
По большому счёту там достаточно простая струкутра, нужно находить узел по значению свойства ObjectID.
Можете в общих чертах описать как работает экономия памяти?