Поиск по блогу

пятница, 6 февраля 2015 г.

Создание канонической XML

Перед формированием подписи (XMLDSIG) сообщение XML должно иметь канонический вид. Канонизация XML - это приведение XML к определенному формату по строгим правилам форматирования и требованиям к содержанию. На платформе 1С создание канонической XML можно выполнить двумя способами:

  1. Новый КаноническаяЗаписьXML;
  2. Новый КаноническийDOM.

Рассмотрим подробнее каждый из методов.

Каноническая запись XML

// Создает каноническое XML-сообщение
//
// Возвращаемое значение:
//   Строка   - XML-сообщение в каноническом виде.
//
Функция СоздатьКаноническуюXML()

КаноническаяXML = Новый КаноническаяЗаписьXML;
ТипКанонизации = ТипКаноническогоXML.ИсключающийКаноническийXMLСКомментариями;
КаноническаяXML.УстановитьСтроку(ТипКанонизации); // Запись в строку.
КаноническаяXML.ЗаписатьОбъявлениеXML();
КаноническаяXML.ЗаписатьНачалоЭлемента("envelope");
КаноническаяXML.ЗаписатьНачалоЭлемента("header");
КаноническаяXML.ЗаписатьКонецЭлемента();
КаноническаяXML.ЗаписатьНачалоЭлемента("body");
КаноническаяXML.ЗаписатьНачалоЭлемента("canonicalization");
КаноническаяXML.ЗаписатьТекст("Каноническое сообщение");
КаноническаяXML.ЗаписатьКонецЭлемента();
КаноническаяXML.ЗаписатьКонецЭлемента();
КаноническаяXML.ЗаписатьКонецЭлемента();

Возврат КаноническаяXML.Закрыть();

КонецФункции // СоздатьКаноническуюXML()


Минус данного метода: создание XML-сообщения с нуля.

Канонический DOM

// Создает каноническое XML-сообщение
//
// Возвращаемое значение:
//   Строка   - XML-сообщение в каноническом виде.
//
Функция СоздатьКаноническуюXML_DOM(СтрокаXML = "")

ДокументDOM = Неопределено;

Если Не ПустаяСтрока(СтрокаXML) Тогда

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаXML);
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);

Иначе

// Создаем документ DOM.
ДокументDOM = Новый ДокументDOM("http://schemas.xmlsoap.org/soap/envelope/", "envelope");

// Далее строим документ DOM.
// ...

КонецЕсли;

КаноническаяXML = Новый КаноническаяЗаписьXML;
ТипКанонизации = ТипКаноническогоXML.ИсключающийКаноническийXMLСКомментариями;
КаноническаяXML.УстановитьСтроку(ТипКанонизации); // Запись в строку.
КаноническаяXML.ЗаписатьОбъявлениеXML();

КаноническийDOM = Новый КаноническийDOM;
КаноническийDOM.Канонизировать(ДокументDOM, КаноническаяXML);

Возврат КаноническаяXML.Закрыть();

КонецФункции // СоздатьКаноническуюXML_DOM()


Данный способ позволяет канонизировать как весь XML, так и его определенную часть, благодаря первому параметру метода:
Канонизировать(<УзелDOM>, <КаноническаяЗаписьВXML>, <РезультатXPath>)
Параметры:
<УзелDOM> (обязательный)
Тип: АтрибутDOM, ДокументDOM, ЭлементDOM, ОпределениеТипаДокументаDOM, НотацияDOM, СущностьDOM, ФрагментДокументаDOM, ТекстDOM, КомментарийDOM, СекцияCDATADOM, ИнструкцияОбработкиDOM, СсылкаНаСущностьDOM, ПространствоИменXPath.
Узел DOM, который нужно записать в каноническом виде.

<КаноническаяЗаписьВXML> (обязательный)
Тип: КаноническаяЗаписьXML.
Объект для записи в каноническом виде.

<РезультатXPath> (необязательный)
Тип: РезультатXPath.
Результат XPath выражения. Если задан, будет использоваться для фильтрации DOM узлов при записи. Если не задан, все узлы участвуют в записи.

Описание:
Записывает узел DOM в каноническом виде.
Доступность:
Тонкий клиент, сервер, толстый клиент, внешнее соединение.

1 комментарий: