2016-10-05 10 views
1

Я получил первую версию WSDL с его схемами ти следующего типа:Каждый элемент коллекции должен идти между их соответствующими в XSD?

<xs:complexType name="AComplexType"> 
    <xs:sequence> 
    <xs:element minOccurs="0" name="description" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="version" nillable="true" type="xs:int"/> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="Response"> 
    <xs:sequence> 
    <xs:element minOccurs="0" name="responseDescription" nillable="true" type="xs:int"/> 
    <xs:element maxOccurs="unbounded" minOccurs="0" name="listOfElements" nillable="true" type="AComplexType"/> 
    </xs:sequence> 
</xs:complexType> 

Следующая XML является действительным для указанного выше XSD:

<Response> 
    <responseDescription>A response description</responseDescription> 
    <listOfElements> 
    <description>An element descrition</description> 
    <version>1</version> 
    <description>Another element descrition</description> 
    <version>1</version> 
    ... 
    </listOfElements> 
</Response> 

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

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Response", propOrder = { 
    "responseDescription", 
    "listOfElements" 
}) 
public class ConsultaExpedienteGATResponse { 


    @XmlElementRef(name = "estado", namespace = "...", type = JAXBElement.class, required = false) 
    protected JAXBElement<String> responseDescription; 
    @XmlElement(nillable = true) 
    protected List<AComplexType> listOfElements; 

    ... 
} 

Однако, я думал, что такого рода схемы были признаны недействительными и должны быть такими:

<xs:complexType name="Response"> 
    <xs:sequence> 
    <xs:element minOccurs="0" name="responseDescription" nillable="true" type="xs:int"/> 
     <xs:element name="listOfElements"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element maxOccurs="unbounded" name="oneElement" type="AComplexType"/> 
     </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
</xs:complexType> 

С помощью этой схемы, XML, немного отличается:

<Response> 
    <responseDescription>A response description</responseDescription> 
    <listOfElements> 
    <oneElement> 
     <description>An element descrition</description> 
     <version>1</version>   
    </oneElement> 
    <oneElement> 
     <description>Another element descrition</description> 
     <version>1</version>   
    </oneElement> 
    ... 
    </listOfElements> 
</Response> 

Итак, Интересно, есть ли плюсы/минусы для каждого варианта (например, более эффективная синтаксическая обработка xml) или если один из двух является принятым или выбранным по умолчанию.

ответ

0

Хотя XML

<Response> 
    <responseDescription>A response description</responseDescription> 
    <listOfElements> 
    <description>An element descrition</description> 
    <version>1</version> 
    <description>Another element descrition</description> 
    <version>2</version> 
    ... 
    </listOfElements> 
</Response> 

был действителен для первой схемы указано, когда он был unmarshaled на классы (с JAXB аннотациями), порожденных XJC, собственность listOfElements был список, содержащий только последний элемент (в этом случае элемент с описанием «Другое описание элемента» и версия 2).

Допустимый XML для этой схемы действительно

<Response> 
    <responseDescription>A response description</responseDescription> 
    <listOfElements> 
    <description>An element descrition</description> 
    <version>1</version> 
    </listOfElements> 
    <listOfElements> 
    <description>Another element descrition</description> 
    <version>2</version> 
    </listOfElements> 
</Response> 

(Путаница происходит от использования неправильного XML сгенерированного вручную разработчиками WSDL, но затем я создал запрос через SOAP UI для что WSDL и ошибка стали ясными).

То, что осталось, чтобы определить, если это лучше иметь корневой элемент для списка, как

<Response> 
    <responseDescription>A response description</responseDescription> 
    <listOfElements> 
    <AComplexType> 
     <description>An element descrition</description> 
     <version>1</version> 
    </AComplexType> 
    <AComplexType> 
     <description>Another element descrition</description> 
     <version>2</version> 
    </AComplexType> 
    </listOfElements> 
</Response> 

Но ответить на мой первоначальный вопрос, первый XML описано было неправильно.

0

Эффект не повлияет на это решение.

Ваш прежний дизайн полагается на смежность, чтобы связать описания с версиями. Это не является «недействительным». Хотя вы увидите этот шаблон в XML на основе документов (например, заголовки предыдущих абзацев), он не идеален для XML, ориентированного на данные.

Вместо этого сделайте связь более явной с помощью иерархии, как в последнем дизайне, или с помощью атрибутов (особенно для version, что вряд ли потребует подчиненной разметки). См. Также XML attribute vs XML element.

+0

Да, он полагается на смежность, и именно поэтому я думал, что это неверно, потому что оно кажется очень «хрупким». Кроме того, когда я говорю о производительности, я думал о том, как синтаксический анализатор знает, что один элемент завершается, а другой запускается (кажется, больше работы, которые зависят от начальных и конечных тегов). С другой стороны, мы можем думать, что в первом варианте использование большей пропускной способности из-за меньшего количества тегов. – gabrielgiussi

+0

Я согласен с вами в том, что первый вариант лучше подходит для ориентированного на данные XML, но у меня нет серьезных причин отклонять предложенные схемы другой командой. – gabrielgiussi

+0

Первый вариант зависит от смежности и лучше подходит для *** документа *** ориентированного XML. (Ваш комментарий имеет обратную сторону, возможно, опечатку.) Идите со вторым вариантом, который лучше подходит для ориентированного на данные XML, который у вас есть, и будет лучше отображаться для объектов, если вам когда-либо понадобится это делать. Опять же, производительность просто не проблема. Вы никогда не дойдете до такой степени, что накладные расходы на разметку станут узким местом для вашей системы. – kjhughes

1

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

Мои предпочтения относятся к «жалюзи» (с объявленными глобальными декларациями элементов и/или названными сложными типами, но обычно не для обоих); потому что глобальные декларации являются многоразовыми. Это особенно полезно, если вы используете XSLT и XQuery, ориентированные на схему, потому что глобальные имена элементов и типов могут быть использованы в вашем коде XSLT/XQuery.

+0

Это правда, но OP задает вопрос о фактическом дизайне XML, а не шаблонах проектирования XSD. – kjhughes

+0

Возможно, вы правы, внимательно прочитав его. –