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