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>