Альтернативные способы работы с 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! 10%

Перенос данных 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 23652 руб.

12.06.2017    142493    808    297    

423

SALE! 10%

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

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

35000 31500 руб.

15.12.2021    24502    172    51    

131

SALE! 10%

Перенос данных 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 31500 руб.

23.07.2020    52377    230    72    

188

SALE! 10%

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

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

48278 43450 руб.

25.02.2015    171564    306    257    

383

SALE! 10%

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

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Предлагаем качественное и проверенное временем решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам. При выходе новых релизов конфигураций 1C оперативно выпускаем обновление переноса данных.

55778 50200 руб.

24.04.2015    195486    155    244    

284

SALE! 10%

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

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

53111 47800 руб.

03.12.2020    36990    96    66    

92

SALE! 10%

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

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой

55778 50200 руб.

15.04.2019    72469    184    150    

124

Перенос данных 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    187389    591    517    

529
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Angeros 09.08.12 04:42 Сейчас в теме
Все классно, но как-то суховато. И еще непонятно где потерялся пример на языке 1с?
2. 1cspecialist 1467 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]",...
Оставьте свое сообщение