Обычно для заданного графа возможны несколько вариантов кодирования. При сериализации графа для передачи в сообщении SOAP ДОЛЖНО использоваться представление, десериализация которого порождает тождественный граф; если возможны несколько разных представлений, МОЖЕТ использоваться любое из них. При получении закодированного сообщения SOAP ДОЛЖНЫ приниматься все представления.
5.1.1 Кодирование ребер и узлов графа
Каждое ребро графа кодируется как информационный объект-элемент, и каждый информационный объект-элемент представляет ребро графа. В 5.1.3 описывается отношение между метками ребер и свойствами [local name] и [namespace name] таких информационных объектов-элементов.
Узел графа, в котором завершается ребро, определяется при анализе сериализированного XML следующим образом:
1 Если информационный объект-элемент, представляющий ребро, не имеет среди своих атрибутов информационного объекта-атрибута ref (см. 5.1.5.2), тогда говорят, что информационный объект-элемент представляет узел графа, и ребро заканчивается в этом узле. В таких случаях информационный объект-элемент представляет и ребро графа, и узел графа.
2 Если информационный объект-элемент, представляющий ребро, имеет среди своих атрибутов информационный объект-атрибут ref (см. 5.1.5.2), то значение этого информационного объекта-атрибута ДОЛЖНО быть идентично значению ровно одного информационного объекта-атрибута id (см. 5.1.5.1) в том же конверте. В этом случае ребро заканчивается в узле графа, представленном информационным объектом-элементом, к которому относится информационный объект-атрибут id. Этот информационный объект-элемент ДОЛЖЕН находиться в области действия атрибута encodingStyle со значением "http://www.w3.org/2003/05/soap-encoding" (см. [ИСО/МЭК 40210, пункт 8.1.1]).
Все узлы графа кодируются, как описано выше в случае 1. Дополнительные входящие ребра для многоссылочных узлов графа кодируются, как описано выше в случае 2.
5.1.2 Кодирование простых значений
Лексическое значение узла графа, представляющего простое значение, описывается последовательностью символов Unicode, идентифицированных дочерними элементами информационного объекта-символа информационного объекта-элемента, представляющего данный узел. Информационный объект-элемент, представляющий узел с простым значением, МОЖЕТ содержать информационный объект-атрибут nodeType (см. 5.1.7). Необходимо отметить, что определенные символы Unicode не могут быть представлены в XML [XML 1.0].
5.1.3 Кодирование составных значений
Исходящее ребро узла графа кодируется как дочерний информационный объект-элементинформационного объекта-элемента, представляющего узел (см. 5.1.1). Различные правила применяются в зависимости от того, какой вид составного значения представляет узел графа. Эти правила состоят в следующем:
1 Для ребра графа, которое характеризуется меткой, свойства [local name] и [namespace name] дочернего информационного объекта-элемента вместе определяют значение метки ребра.
2 Для ребра графа, которое характеризуется позицией:
- порядковая позиция ребра графа соответствует позиции дочернего информационного объекта-элемента относительно его одноуровневых элементов;
- свойства [local name] и [namespace name] дочернего информационного элемента не являются значимыми.
3 Информационный объект-элемент, представляющий узел с составным значением, среди своих атрибутов МОЖЕТ иметь информационный объект-атрибут nodeType (см. 5.1.7).
4 Следующие правила применяются к кодированию узла графа, который представляет "массив":
- информационный объект-элемент, представляющий узел массива, среди своих атрибутов МОЖЕТ иметь информационный объект-атрибут itemType (см. 5.1.4.1);
- информационный объект-элемент, представляющий узел массива, среди своих атрибутов МОЖЕТ иметь информационный объект-атрибут arraySize (см. 5.1.6).
5 Если ребро графа не завершается в узле графа, тогда оно может быть опущено при сериализации или закодировано как информационный объект-элемент с информационным объектом-атрибутом xsi:nil со значением true.
5.1.4 Вычисление свойства "имя типа"
Свойство "имя типа" узла графа - это пара {namespace name, local name}, вычисляемая следующим образом:
1 Если у информационного объекта-элемента, представляющего узел графа, среди своих атрибутов есть информационный объект-атрибут xsi:type, тогда свойство "имя типа" узла графа - это значение информационного объекта-атрибута xsi:type.
Примечание - Данный атрибут имеет тип xs:QName [Схема XML ч.2]; его значение состоит из пары {namespace name, local name}. Ни префикс, используемый для создания QName, ни любая информация, касающаяся любых определений типа, не являются частью значения. Граф SOAP содержит только полностью квалифицированное имя типа.
2 В случае, если родительский информационный объект-элемент информационного объекта-элемента, представляющий узел графа, среди своих атрибутов имеет информационный объект-атрибут enc:itemType (см. 5.1.4.1), тогда свойство "имя типа" узла графа - это значение информационного объекта-атрибута enc:itemType.
3 В противном случае значение свойства "имя типа" узла графа не определено.
Примечания
1 Эти правила определяют, как свойство "имя типа" узла графа вычисляется из сериализированного кодирования. Данная спецификация не требует проверки корректности с использованием специфического языка для описания схем или системы типов. Также она не включает встроенные типы и не приводит стандартизованных ошибок для описания конфликтов значений и имен типов.
2 Тем не менее, разработка дополнительных спецификаций для описания использования кодирования SOAP, основанного на специфических языках для описания схем или системы типов, не запрещена. Такие дополнительные спецификации МОГУТ накладывать требования на проверку корректности с использованием определенного языка описания схемы и МОГУТ определять, какие должны быть сгенерированы ошибки в случае неуспешно завершившейся проверки корректности. Такие дополнительные спецификации МОГУТ определять дополнения к десериализованному графу на основе информации, полученной после проверки корректности. Использование кодировщиком SOAP атрибута xsi:type предназначено для упрощения интеграции с языком W3C XMLSchema (см. приложение С). Другие языки для описания схем, схемы данных и программных систем типов, основанные на XML, МОГУТ использоваться, но только при условии, что они совместимы с сериализацией, описанной в данной спецификации.
5.1.4.1 Информационный объект-атрибут itemType
Информационный объект-атрибут itemType имеет следующие свойства инфо-набора:
[local name] itemType;
[namespace name] "http://www.w3.org/2003/05/soap-encoding";
[specified] со значением true.
Тип информационного объекта-атрибута itemType - xs:QName. Значение информационного объекта-атрибута itemType используется для вычисления свойства "имя типа" (см. 5.1.4) элемента массива.
5.1.5 Уникальные идентификаторы
5.1.5.1 Информационный объект-атрибут id
Информационный объект-атрибут id имеет следующие свойства инфо-набора:
- [local name] id;
- [namespace name] "http://www.w3.org/2003/05/soap-encoding";
- [specified] со значением true.
Тип информационного объекта-атрибута id - xs:ID. Значение информационного объекта-атрибута id - уникальный идентификатор, на который можно ссылаться из информационного объекта-атрибута ref (см. 5.1.5.2).
5.1.5.2 Информационный объект-атрибут ref
Информационный объект-атрибут ref имеет следующие свойства инфо-набора:
- [local name] ref;
- [namespace name] "http://www.w3.org/2003/05/soap-encoding";
- [specified] со значением true.
Тип информационного объекта-атрибута ref - xs:IDREF. Значение информационного объекта-атрибута ref является ссылкой на уникальный идентификатор, определенный информационным объектом-атрибутом id (см. 5.1.5.1).
5.1.5.3 Ограничения на информационные объекты-атрибуты id и ref
Значение информационного объекта-атрибута ref ДОЛЖНО быть идентично значению ровно одного информационного объекта-атрибута id.