Войти

Алгоритм трансформации XML-сообщений

Во время инициализации запроса любое сообщение проходит важные этапы своего формирования. Первичным этапом является подписание электронной подписью (ЭП) всех представленных в XML файле бизнес-данных, включая приложенные файлы. Все фрагменты конверта при подписании ЭП в формате XMLDSig обязательно проходят итоговую трансформацию с использованием алгоритма urn://smev-gov-ru/xmldsig/transform.

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

Алгоритм трансформации XML сообщения после его подписания состоит из нескольких этапов. В первую очередь в XML-документе удаляются все не обязательные компоненты, в которые входят все обращения или объявления типа документа и дополнительные инструкции. Например, следующие строки будут исключены:

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet href = "filename.css" type = "text/css"?>

Следом идет трансформация самозакрывающихся элементов. Изначально каждый XML-элемент может содержать внутри себя дополнительный контекст, который будет находится между начальным тегом и конечным или открывающимся и закрывающимся тегами.

<element>
   Содержание элемента
</element>

Но допускаются элементы без содержания, которые называются пустыми или самозакрывающиеся и они могут иметь следующий вид:

<name />
<age />

Алгоритм трансформации преобразует подобные элементы в полноценную пару открывающихся и закрывающихся тегов только без контекста.

<name></name>
<age></name>

Следующим немаловажным этапом является преобразование пространства имен XML-документа. Основные преобразования алгоритма заключаются в очистке неиспользуемых пространств имен или изменении их обозначений.

Удаление ненужных пространств имен происходит при их объявлении в элементе на каком-либо уровне. При том, что эти имена не используются в низлежащих тегах. В следующем примере пространство имен unknown после трансформации будет удалено.

<Request xmlns:tns="urn://main" xmlns:unknown="urn://unknown">
            <Firstname>Иванов</Firstname>
            <Lastname>Иван</Lastname>
</Request>

Дополнительно проверяется наличие пространства имен для конкретного элемента в этом же элементе или выше по дереву. Если имя отсутствует, то его объявление выполняется в этом конкретном элементе.

Изменение обозначений пространства имен заключается в подмене префиксов всех имен и атрибутов соответственно на автоматически сгенерированные. Сгенерированный префикс состоит из постоянной части ns в начале и из последовательной сквозной нумерации по нарастающей от единицы в конце. За счет этого устраняется их дублирование. Например, имеется XML-сообщение следующего вида:

<tns:Request xmlns:tns="urn://main">
    <user:UserInfo xmlns:user="urn://user">
        <user:Firstname>Иванов</user:Firstname>
        <user:Lastname>Иван</user:Lastname>
    </user:UserInfo>
   <doc:Document xmlns:doc="urn://document">
        1234567890
    </doc:Document>
</tns:Request>

После прохождения этого сообщения через алгоритм трансформации все пространства имен примут вид согласно правилам:

<tns:Request xmlns:tns="urn://main">
    <ns1:UserInfo xmlns:ns1="urn://user">
        <ns1:Firstname>Иванов</ns1:Firstname>
        <ns1:Lastname>Иван</ns1:Lastname>
    </ns1:UserInfo>
    <ns2:Document xmlns:ns2="urn://document">
        1234567890
    </ns2:Document>
</tns:Request>

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

<tns:Request xmlns:tns="urn://main">
    <ns1:Document
        elemB="value"
        elemA="value"
        xmlns:ns1="urn://document"
        elemC="value">
        1234567890
    </ns1:Document>
</tns:Request>

Примет вид:

<tns:Request xmlns:tns="urn://main">
    <ns1:Document
        xmlns:ns1="urn://document"
        elemA="value"
        elemB="value"
        elemC="value">
        1234567890
    </ns1:Document>
</tns:Request>

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

Рекомендуется дополнительно более подробно изучить декодирование текста во время трансформации XML-документа. Для этого ознакомиться с Приложением A Методических рекомендаций

Авторизуйтесь, чтобы оставить комментарий к статье