Xml и использование выбора в качестве корня документа

У меня есть немного вопрос схемы xml-новичка. Я верю, что ответ заключается в том, что мне нечего делать с помощью схемы, но я бы хотел быть уверен. Проблема в том, что у меня есть веб-сервис, который возвращает ответ с одним типом корневого элемента при успехе (например, <Response> ) и при полном сбое возвращает документ с другим корневым элементом (например, < Исключение), Итак, в основном, два совершенно разных документа:

<Response> ...... </Response> ИЛИ
< Исключение > .... </Исключение >

Можно ли описать эти два разных документа одним документом схемы? Это похоже на то, что я хочу, чтобы выбор был первым элементом под элементом схемы, но это недействительный синтаксис. Я пробовал пару вариантов, которые анализируют как действительный xsd, но не проверяют документы. Какие-либо предложения? Или это просто невозможно? Большое спасибо заранее - m

Ответ 1

На самом деле, XML-схема позволяет вам определять альтернативные корневые элементы в одной схеме, хотя не используя элемент choice. Вместо этого все, что вам нужно сделать, это перечислить каждый из возможных корней в качестве прямых дочерних элементов вашего элемента schema.

Например, с учетом следующей XML-схемы:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="foo">
        ...
    </xs:element>
    <xs:element name="bar">
        ...
    </xs:element>
</xs:schema>

Любой из следующих документов будет проверять его:

<foo>
    ...
</foo>

Или:

<bar>
    ...
</bar>

Ответ 2

Я столкнулся с этим сообщением, и я подумал, что стоит упомянуть, что я вижу из мира веб-сервисов Spring (те, которые дают первостепенное значение контракту данных).

Одним из хороших способов согласования этой проблемы с корневым элементом является прямое определение нескольких корневых элементов под элементом схемы, как упомянул Фил Бут.

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

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">   
<xs:element name="foo">   
    ...   
</xs:element>   
<xs:element name="bar">   
    ...   
</xs:element>   

инфраструктура веб-службы, такая как Spring -WS, которая опирается на эту так называемую схему контрактов данных для создания веб-службы, может не понять, если <foo> или < бар > является корневым элементом запроса для службы.

Пожалуйста, обратитесь к этой ссылке - Контракт данных

В таких случаях я нашел подход, предложенный Джоном в CashCommons или Стивеном Рашинге полезным.

Ответ 3

Это невозможно, но альтернатива не так уж плоха. Просто объявите root node, который вводится как выбор, и попросите приложение вернуть "ответ" node с дочерним элементом "success" или "exception". Если вы не можете изменить приложение, вам не повезло, но с таким простым ответом вы не могли бы создать две разные схемы, прочитайте firstChild node, а затем примените соответствующую схему?

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
   <xs:element name="Response">
    <xs:complexType>
        <xs:choice>
            <xs:element name="Success"/>
            <xs:element name="Exception"/>
        </xs:choice>
    </xs:complexType> 
   </xs:element>
</xs:schema>