XML-схема и использование выбора в качестве корня документа - PullRequest
15 голосов
/ 28 октября 2009

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

...... ИЛИ
....

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

Ответы [ 3 ]

34 голосов
/ 04 ноября 2009

На самом деле, схема 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>
1 голос
/ 29 марта 2010

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

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

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

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

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

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

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

0 голосов
/ 23 декабря 2009

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

<?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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...