Альтернативные способы работы с XML. Часть 2: Введение в xPath или запросы к XML

13.08.12

Разработка - Математика и алгоритмы

В предыдущей статье "Введение в DOM или объектная модель документа" было описано понятие объектной модели документа (DOM), раскрыты плюсы и минусы использования модели при разборе файлов XML, приведено сравнение с построчным последовательным разбором. Были представлены варианты выборки данных с помощью объекта 1С ДокументDOM. Теперь настало время познакомить читателей с самым, на мой взгляд, интересным способом извлечения данных из XML - при помощи языка запросов xPath.

В предыдущей статье Введение в DOM или объектная модель документа было описано понятие объектной модели документа (DOM), раскрыты плюсы и минусы использования модели при разборе файлов XML, приведено сравнение с построчным последовательным разбором. Были представлены варианты выборки данных с помощью объекта 1С ДокументDOM. Теперь настало время познакомить читателей с самым, на мой взгляд, интересным способом извлечения данных из XML - при помощи языка запросов xPath (XML Path Language).

Модель DOM имеет древовидную структуру, зачастую ей проводят аналогию с организацией хранения файлов в папках, где каждый конечный узел сравнивают с файлом, нахождение которого заранее известно по пути до него через папки и подпапки. Не зря в названии языка присутствует слово "путь" (path в переводе с английского означает путь). Именно определение пути к данным лежит в основе xPath.

На вход конструкции xPath подается выражение, определяющее путь до искомых узлов, например такое "/someTag/someSubTag" (означает выборку всех элементов с именем someSubTag внутри элементов someTag, расположенных на первом уровне документа). На выходе образуется список найденных узлов. Список представляет собой коллекцию, которую можно обойти циклом и произвести манипуляции с узлами-элементами списка, например извлечь их значения.

Давайте подробнее остановимся на выражении xPath, определяющем путь, и его составных частях. Выражение состоит из так называемых шагов адресации (имен тегов), разделенных слэшем - косой чертой "/" и как уже было сказано выше - очень похоже на путь к файлу в файловой системе. Если путь начинается с "/", то это задает абсолютный путь к заданному элементу (от корня документа). Если же путь начинается с "//", то это означает произвольное (любое) количество уровней (от корня документа) перед искомым путем. Символ "*" в пути означает любой элемент, тот же символ в конце пути означает, что нужно выбрать все элементы по пути, указанному до этого символа, например "//someTag/someSubTag/*" (выбрать все элементы по пути /someTag/someSubTag, при этом расположение начала пути от корня документа не имеет значения и может начинаться на любом уровне).

Также в адресации могут использоваться квадратные скобки, которые задают более четкие критерии поиска, например "/someTag/someSubTag[1]" (первый элемент из найденных) или "/someTag/someSubTag[last()]" (последний элемент из найденных). Как видно, в квадратных скобках могут использоваться еще и специальные функции. Также в квадратных скобках могут задаваться условия на наличие у узлов атрибутов, на значение атрибутов, условия-отрицания и многое другое. Ниже приведена ссылка, по которой можно посмотреть различные варианты условий.

В 1С работа с xPath реализована через метод объекта ДокументDOM ВычислитьВыражениеXPath. Вариант синтаксиса языка 1с для работы с xPath приведен ниже:

вариант синтаксиса 1с для работы с xPath

Теперь для наглядности работы выборки xPath выражения посмотрите скриншоты ниже:

Пример 1

Пример 2

Пример 3

Пример 4

Пример 5

Углубиться в тему и посмотреть примеры (в т.ч. и более сложные) различных xPath выражений можно по этой ссылке.

См. также

SALE! 15%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

26280 руб.

12.06.2017    142245    803    297    

423

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

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.236.x) и БП 3.0 (3.0.164.x). Правила подходят для версии ПРОФ и КОРП.

35000 руб.

15.12.2021    24359    172    51    

131

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.88.x) и УТ 11.5 (11.5.20.x).

35000 руб.

23.07.2020    51976    229    72    

187

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 Платформа 1C v8.2 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием Россия Платные (руб)

Регулярный обмен, выгрузка, перенос из КА 1.1, УПП 1.3, УТ 10.3 для обмена с любыми конфигурациями, поддерживающими обмен в формате EnterpriseData (КД3) - БП 3.0, ERP, КА 2, УТ 11, Розница 2, УНФ 1.6 и другими. Правила для старых и доработанных конфигураций не требуют синхронного обновления и совместимы с новыми и будущими конфигурациями. Обмен по расписанию, через папку, FTP, почту.

15300 руб.

18.02.2016    187202    591    512    

529

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    10948    13    8    

15

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Что же Вы получаете? 2 способа обмена объектами – с ОДИНАКОВОЙ структурой и с ОТЛИЧАЮЩЕЙСЯ! Забудьте о том, что не могли ранее перенести данные между базами, из-за того, что изменилась структура объектов в одной из них с обновлением конфигурации – теперь это в прошлом! Теперь не помеха для обмена изменение состава реквизитов объекта (измерений, ресурсов)/состава табличных частей/реквизитов табличных частей/типов реквизитов! А так же получаете быстрый алгоритм обмена, с возможностью указания уровня выгрузки объектов по ссылкам! 3 способа обмена - ФАЙЛ, HTTP, COM: Система слежения за дублями предопределенных элементов при загрузке; Система поиска связей объектов для выгрузки; Отборы для каждого объекта конфигурации в отдельности; Динамическая замена произвольных ссылок при обмене; Выбор регистров движений для выгрузки. (Обновление от 27.06.2024, версия 9.1 - 10.1)

16800 руб.

28.08.2012    209273    304    281    

657

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Правила в универсальном формате обмена для предыдущих версий конфигураций УТ 11.0, УТ 11.1, УТ 11.2, УТ 11.3, УТ 11.4, УТ 11.5, с момента выхода которых прошло более года.Обмен с любыми последними конфигурациями, поддерживающими обмен в EnterpriseData - БП 3.0, ERP, УТ, КА, УНФ, Розница. Не требуется обновления правил после обновления других конфигураций, участвующих в обмене - версии конфигураций могут быть произвольными. Обмен осуществляется через планы обмена кнопкой "Синхронизация" вручную или автоматически по расписанию, или вручную обработкой.

20580 руб.

13.09.2021    21701    37    32    

24

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

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:ERP Управление предприятием 2.5 и 1С:Комплексную автоматизацию 2.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.234.x), ERP 2.5 (2.5.19.x), КА 2.5 (2.5.19.x).

35000 руб.

24.06.2020    63839    55    27    

86
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Angeros 09.08.12 04:42 Сейчас в теме
Все классно, но как-то суховато. И еще непонятно где потерялся пример на языке 1с?
2. 1cspecialist 1468 09.08.12 11:23 Сейчас в теме
(1) пример есть в предыдущей статье
вы считаете, что нужно здесь повторить?
3. kasper076 111 09.08.12 15:08 Сейчас в теме
Оч короткие статьи. Это для того чтобы рейтинга больше срубить?
4. kilokilo 18 10.08.12 00:55 Сейчас в теме
Тема хорошая, но не раскрыта совершенно.. ссылка на "углубиться" - вообще не "вставила".. но + пока авансом - в надежде на дополнение статьи..
5. awk 744 13.08.12 12:13 Сейчас в теме
Тихо "скиздил" и ушел - называется нашел? Это ссылка, а не статья.
6. logarifm 1123 14.08.12 12:05 Сейчас в теме
Статья есть, а примеров кода нет. Пример файла отсутствует.
7. abondarev.kg 15.09.12 20:19 Сейчас в теме
Единственный плюс от статьи - само понятие "ДокументDOM"
код как для эксполйтов написан, чтоб без напильника не работал - изначально не рабочий, т.к. половина определений пропущена в самом интересном месте "ВычислитьВыражениеXPath".
кармы не хватает, а так бы минусанул...
Andris_infostart; +1 1 Ответить
8. podorognik 28.02.13 11:27 Сейчас в теме
а примеров кода в 1с нету?
9. kuza_87 28 03.02.14 10:27 Сейчас в теме
Тема абсолютно не раскрыта.Приведите пример из 1с
10. Buxxter 42 24.02.14 19:49 Сейчас в теме
Исходный файл:
<?xml version="1.0" encoding="UTF-8"?>
<aaa>
	<qq>
		<ololo/>
	</qq>
	<cjhg/>
	<ybkajs>
		<whvfsj/>
		<uahsf>
			<ibbbwjke/>
			<ibbbwjke/>
			<ibbbwjke/>
			<ibbbwjke/>
		</uahsf>
	</ybkajs>
	<bbb>
		<ccc name="Пыщь1"/>
		<ccc name="Пыщь2"/>
		<ccc name="Пыщь3"/>
		<ccc name="Пыщь4"/>
		<ccc name="Пыщь5"/>
		<coc name="ПыщьЛевый"/>
	</bbb>
</aaa>
Показать


Код в 1с:
ЧтениеХМЛ = Новый ЧтениеXML;
ЧтениеХМЛ.ОткрытьФайл("C:\test.xml");

ПостроительДом = Новый ПостроительDOM;
ДокументДом = ПостроительДом.Прочитать(ЧтениеХМЛ);

Разыменовыватель = Новый РазыменовательПространствИменDOM(ДокументДом);
Выражение = ДокументДом.СоздатьВыражениеXPath("/aaa/bbb/*", Разыменовыватель);
Рез = Выражение.Вычислить(ДокументДом);

ПолученныйЭлемент = Рез.ПолучитьСледующий();

Пока ПолученныйЭлемент <> Неопределено Цикл
	
	ИмяЭл	= ПолученныйЭлемент.Атрибуты.ПолучитьИменованныйЭлемент("name");
	
	Если ИмяЭл = Неопределено Тогда
		ПолученныйЭлемент = Рез.ПолучитьСледующий();
		Продолжить;
	КонецЕсли;
	
	Сообщить(ИмяЭл);
ПолученныйЭлемент = Рез.ПолучитьСледующий();

КонецЦикла;
Показать


Результат окна сообщений:
Пыщь1
Пыщь2
Пыщь3
Пыщь4
Пыщь5
ПыщьЛевый


Со звездочками уже сами поэкспериментируйте как-нть
Ish_2; fixin; fokses; zfirstprog; zif74; bonya_by; +6 Ответить
13. fixin 4276 20.07.20 21:58 Сейчас в теме
(10)
ПолученныйЭлемент.Атрибуты.ПолучитьИменованныйЭлемент("name");

Это лучше в статью перенести, а то не понятно было как делать, пока комменты не почитал. Спасибо в любом случае за пример.
11. glime 106 25.03.15 09:34 Сейчас в теме
Добрый день не могли бы вы проконсультировать один вопрос по статье http://infostart.ru/public/146281/, и использование xPath, вопрос заключается в том что есть узел
<point x="529" y="82">
мне надо найти его
если я пишу
.ВычислитьВыражениеXPath("//shape/point[@x="529"@y="82"]",...
выдает ошибку, как правлеьно задать выражение для поиска?
12. vikad 131 25.03.15 11:15 Сейчас в теме
(11) glime, могу ошибаться, но похоже надо просто экранировать кавычки
.ВычислитьВыражениеXPath("//shape/point[@x=""529""@y=""82""]",...
или вообще их убрать
.ВычислитьВыражениеXPath("//shape/point[@x=529@y=82]",...
Оставьте свое сообщение