Руководство разработчика

Объектный тип XML_КУРСОР

Объектный тип XML_КУРСОР предназначен для работы с XML-документами. После открытия или создания XML-документа одним из методов ОТКРЫТЬ_ФАЙЛ, СОЗДАТЬ_ФАЙЛ или ОТКРЫТЬ_СТРОКУ курсор связывается с узлом созданного или открытого документа. Потом курсор можно передвигать по узлам документа, получать о них информацию и редактировать их. XML_КУРСОР - это физический тип с копированием физического представления, что дает возможность путем простого присваивания создавать несколько курсоров, указывающих на узлы в одном и том же XML-документе. После присваивания курсоры могут независимо передвигаться по документу. Для совершения действий, относящихся к всему документу в целом (например, сохранения или закрытия документа), пригоден любой курсор из числа связанных с узлами документа.

Методы перемещения курсора возвращают логическое значение: Да в случае, когда перемещение произошло успешно, и НЕТ в противном случае, когда перемещение невозможно. В этом случае курсор остается на прежнем месте.

Модуль поддерживает открытие XML-документов с любой кодировкой (если, конечно, она корректно описана инструкцией обработки). При сохранении, если требуется определенная кодировка, ее можно изменить посредством метода ИЗМЕНИТЬ_ИНСТРУКЦИЮ и потом сохранить – файл будет сохранен именно в этой кодировке. Загрузка из строки и сохранение в строку всегда требуют кодировки UTF-16.

Режим расширенной поддержки текстовых узлов

По умолчанию курсор работает в упрощенном режиме при получении и установке текста узлов. В упрощенном режиме предполагается, что с обычным узлом (элементом) может быть связан только один текстовый фрагмент.

В реальности узел (элемент) может иметь множество дочерних элементов и текстовых узлов. Текстовые узлы – это узлы типа PCDATA (Plain Character Data) и секции CDATA. Секции CDATA позволяют включать в документ не экранированный текст, например фрагменты html.

В режиме расширенной поддержки текстовых узлов курсор при навигации может останавливаться не только на элементах, но и на узлах типа PCDATA и CDATA. Также имеется возможность добавлять текстовые узлы. Для добавления и поиска используются специальные имена "#PCDATA" и "#CDATA" соответственно. Следует иметь ввиду, что текстовые узлы не могут иметь дочерних узлов и атрибутов.

Методы

МетодОписание
ОТКРЫТЬ_ФАЙЛ Открывает XML-файл
СОЗДАТЬ_ФАЙЛ Создает XML-документ
СОХРАНИТЬ Сохраняет XML-файл
ЗАКРЫТЬ Закрывает документ, освобождает связанные ресурсы.
ОК Проверяет работоспособности курсора.
АТРИБУТ Считывает атрибут.
СУЩ_АТРИБУТ Проверяет существование атрибута
ЗАП_АТРИБУТ Устанавливает значение атрибута.
УДАЛИТЬ_АТРИБУТ Удаляет атрибут.
КОЛ_АТРИБУТОВ Возвращает число атрибутов.
ИМЯ_АТРИБУТА Возвращает имя атрибута по его позиции.
ТЕКСТ Возвращает текст узла.
ЗАП_ТЕКСТ Устанавливает текст узла.
КОРЕНЬ Перемещает курсор в корневой узел документа.
ВВЕРХ Перемещает курсор на уровень вверх.
ВНИЗ_ПЕРВ Перемещает курсор на первый дочерний узел
СЛЕД Перемещает курсор на следующий узел на том же уровне
ПРЕД Перемещает курсор на предыдущий узел на том же уровне
СПИСОК_СЛЕД Перемещает курсор на следующий узел на том же уровне с таким же именем
СПИСОК_ПРЕД Перемещает курсор на предыдущий узел на том же уровне с таким же именем
ВНИЗ_НАЙТИ Перемещает курсор на первый дочерний узел с заданным именем
ВНИЗ_ПОЗ Перемещает курсор на дочерний узел по его номеру
ДОБАВИТЬ_УЗЕЛ Добавляет узел
УДАЛИТЬ_УЗЕЛ Удаляет узел
КОЛ_УЗЛОВ Возвращает число дочерних узлов
ИМЯ_УЗЛА Возвращает имя узла
ПОЗИЦИЯ_УЗЛА Возвращает позицию узла среди узлов на его уровне. Метод неэффективен, использовать только для отладки.
КОПИРОВАТЬ_УЗЕЛЫ Копирует ветку узлов из одного курсора в другой
ИЗМЕНИТЬ_ИНСТРУКЦИЮ Изменяет инструкцию обработки (processing instruction)
ОТКРЫТЬ_СТРОКУ Загружает XML-документ, содержащийся в строке.
СОХРАНИТЬ_В_СТРОКУ Сохраняет XML-документ в строку.

Пример:

Допустим, имеется файл pricelist.xml со следующим содержимым:

<?xml version="1.0" encoding="UTF-8"?>
<inventory>
    <snack>
        <chips name="pringles">
            <price>4.50</price>
            <amount>60</amount>
        </chips>
    </snack>
</inventory>

В этом файле хранится некоторая информация о товарах. Ниже представлен пример работы с данным файлом:

ТИП Напиток    // тип, в котором хранится информация о напитке
[
    СТРОКА: категория = "drink";
    СТРОКА: название = "name";
    ЧИСЛО: цена = 0;
    ЧИСЛО: количество = 0;
]

ТИП ПрайсЛист
[
    XML_КУРСОР: прайс;

    // метод открывает указанный xml-файл
    ФУНКЦИЯ Загрузить(СТРОКА: путь)
        ЕСЛИ НЕ прайс.ОТКРЫТЬ_ФАЙЛ(путь) ТО
            ОШИБКА("Ошибка загрузки прайс-листа!")
        КОНЕЦ_ЕСЛИ
    КОНЕЦ_ФУНКЦИИ

    // метод для добавления в xml-файл указанного напитка
    ФУНКЦИЯ ДобавитьНапиток (Напиток: напиток)
        ЕСЛИ прайс.ОК ТО
            прайс.КОРЕНЬ

            // устанавливаем курсор на узел "drink"
            // в случае неудачи создаем этот узел
            ЕСЛИ НЕ прайс.ВНИЗ_НАЙТИ("drink") ТО
                прайс.ДОБАВИТЬ_УЗЕЛ("drink")
            КОНЕЦ_ЕСЛИ

            прайс.ДОБАВИТЬ_УЗЕЛ(напиток.категория)
            прайс.ЗАП_АТРИБУТ("name", напиток.название)

            прайс.ДОБАВИТЬ_УЗЕЛ("price")
            прайс.ЗАП_ТЕКСТ(напиток.цена)
            прайс.ВВЕРХ

            прайс.ДОБАВИТЬ_УЗЕЛ("amount")
            прайс.ЗАП_ТЕКСТ(напиток.количество)
            
            прайс.СОХРАНИТЬ()

        ИНАЧЕ
            ОШИБКА("Прайс-лист не загружен!")
        КОНЕЦ_ЕСЛИ
    КОНЕЦ_ФУНКЦИИ
]

ВЫЧИСЛИТЬ

    ПЕРЕМ ПрайсЛист: пл
    пл.Загрузить("xml/pricelist.xml")

    пл.ДобавитьНапиток([категория = "lemonade",
                        название = "coca-cola",
                        цена = 2.50,
                        количество = 20])

    пл.ДобавитьНапиток([категория = "milk",
                        название = "danone",
                        цена = 2.00,
                        количество = 30])

КОНЕЦ

В результате выполнения примера содержимое файла pricelist.xml будет выглядеть следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<inventory>
    <snack>
        <chips name="pringles">
            <price>4.50</price>
            <amount>60</amount>
        </chips>
    </snack>
    <drink>
        <lemonade name="coca-cola">
            <price>2.5</price>
            <amount>20</amount>
        </lemonade>
        <milk name="danone">
            <price>2</price>
            <amount>30</amount>
        </milk>
    </drink>
</inventory>

См. также: