Альтернативные способы работы с 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 не будет опубликован. Обязательные поля помечены *