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

Публикация № 146281

Программирование - Теория программирования

51
В предыдущей статье "Введение в 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 выражений можно по этой ссылке.

51

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. Angeros 09.08.12 04:42 Сейчас в теме
Все классно, но как-то суховато. И еще непонятно где потерялся пример на языке 1с?
2. 1cspecialist 1385 09.08.12 11:23 Сейчас в теме
(1) пример есть в предыдущей статье
вы считаете, что нужно здесь повторить?
3. kasper076 47 09.08.12 15:08 Сейчас в теме
Оч короткие статьи. Это для того чтобы рейтинга больше срубить?
4. kilokilo 18 10.08.12 00:55 Сейчас в теме
Тема хорошая, но не раскрыта совершенно.. ссылка на "углубиться" - вообще не "вставила".. но + пока авансом - в надежде на дополнение статьи..
5. awk 692 13.08.12 12:13 Сейчас в теме
Тихо "скиздил" и ушел - называется нашел? Это ссылка, а не статья.
6. logarifm 1046 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 25 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
ПыщьЛевый


Со звездочками уже сами поэкспериментируйте как-нть
fokses; zfirstprog; zif74; bonya_by; +4 Ответить
11. glime 92 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 112 25.03.15 11:15 Сейчас в теме
(11) glime, могу ошибаться, но похоже надо просто экранировать кавычки
.ВычислитьВыражениеXPath("//shape/point[@x=""529""@y=""82""]",...
или вообще их убрать
.ВычислитьВыражениеXPath("//shape/point[@x=529@y=82]",...
Оставьте свое сообщение