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






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

12 Comments

  1. Angeros

    Все классно, но как-то суховато. И еще непонятно где потерялся пример на языке 1с?

    Reply
  2. 1cspecialist

    (1) пример есть в предыдущей статье

    вы считаете, что нужно здесь повторить?

    Reply
  3. kasper076

    Оч короткие статьи. Это для того чтобы рейтинга больше срубить?

    Reply
  4. kilokilo

    Тема хорошая, но не раскрыта совершенно.. ссылка на «углубиться» — вообще не «вставила».. но + пока авансом — в надежде на дополнение статьи..

    Reply
  5. awk

    Тихо «скиздил» и ушел — называется нашел? Это ссылка, а не статья.

    Reply
  6. logarifm

    Статья есть, а примеров кода нет. Пример файла отсутствует.

    Reply
  7. abondarev.kg

    Единственный плюс от статьи — само понятие «ДокументDOM»

    код как для эксполйтов написан, чтоб без напильника не работал — изначально не рабочий, т.к. половина определений пропущена в самом интересном месте «ВычислитьВыражениеXPath».

    кармы не хватает, а так бы минусанул…

    Reply
  8. podorognik

    а примеров кода в 1с нету?

    Reply
  9. kuza_87

    Тема абсолютно не раскрыта.Приведите пример из 1с

    Reply
  10. Buxxter

    Исходный файл:

    <?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:	est.xml»);
    
    ПостроительДом = Новый ПостроительDOM;
    ДокументДом = ПостроительДом.Прочитать(ЧтениеХМЛ);
    
    Разыменовыватель = Новый РазыменовательПространствИменDOM(ДокументДом);
    Выражение = ДокументДом.СоздатьВыражениеXPath(«/aaa/bbb/*», Разыменовыватель);
    Рез = Выражение.Вычислить(ДокументДом);
    
    ПолученныйЭлемент = Рез.ПолучитьСледующий();
    
    Пока ПолученныйЭлемент <> Неопределено Цикл
    
    ИмяЭл = ПолученныйЭлемент.Атрибуты.ПолучитьИменованныйЭлемент(«name»);
    
    Если ИмяЭл = Неопределено Тогда
    ПолученныйЭлемент = Рез.ПолучитьСледующий();
    Продолжить;
    КонецЕсли;
    
    Сообщить(ИмяЭл);
    ПолученныйЭлемент = Рез.ПолучитьСледующий();
    
    КонецЦикла;
    

    Показать

    Результат окна сообщений:

    Пыщь1
    Пыщь2
    Пыщь3
    Пыщь4
    Пыщь5
    ПыщьЛевый
    

    Со звездочками уже сами поэкспериментируйте как-нть

    Reply
  11. glime

    Добрый день не могли бы вы проконсультировать один вопрос по статье http://infostart.ru/public/146281/, и использование xPath, вопрос заключается в том что есть узел

    <point x=»529″ y=»82″>

    мне надо найти его

    если я пишу

    .ВычислитьВыражениеXPath(«//shape/point[@x=»529″@y=»82″]»,…

    выдает ошибку, как правлеьно задать выражение для поиска?

    Reply
  12. vikad

    (11) glime, могу ошибаться, но похоже надо просто экранировать кавычки

    .ВычислитьВыражениеXPath(«//shape/point[@x=»»529″»@y=»»82″»]»,…

    или вообще их убрать

    .ВычислитьВыражениеXPath(«//shape/point[@x=529@y=82]»,…

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *