Объектный тип 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>