Проблема XML-сериализации для minoccurs - PullRequest
1 голос
/ 18 ноября 2008

У меня есть веб-приложение .NET, которое использует веб-сервис на основе Java. Один из объектов с именем Optional содержит поля критериев поиска. Схема следующая:

<xsd:complexType name="Optional">
 <xsd:sequence>
  <xsd:element name="FromAmount" nillable="true" type="xsd:float" minOccurs="0" /> 
  <xsd:element name="ToAmount" nillable="true" type="xsd:float" minOccurs="0" /> 
  <xsd:element name="FromDate" nillable="true" type="xsd:dateTime" minOccurs="0" /> 
  <xsd:element name="ToDate" nillable="true" type="xsd:dateTime" minOccurs="0" /> 
  <xsd:element name="FromCheckNumber" nillable="true" type="xsd:long" minOccurs="0" /> 
  <xsd:element name="ToCheckNumber" nillable="true" type="xsd:long" minOccurs="0" /> 
 </xsd:sequence>
</xsd:complexType>

Проблема, с которой я сталкиваюсь, заключается в том, что дочерние элементы не будут сериализованы, даже если им присвоено значение в веб-приложении. Если я удалю атрибут minOccurs, то все будет хорошо.

Как мне сделать эти элементы необязательными, кроме как сериализовать, когда им присвоено значение?

Заранее спасибо за помощь.

Ответы [ 3 ]

3 голосов
/ 27 ноября 2008

в .NET WS для необнуляемых типов (в .NET), которые помечены как необязательные в схеме, имеют дополнительное определенное свойство, сгенерированное для них, которое контролирует, появляется ли элемент. Очень досадно, что установщик значения не устанавливает дополнительный указанный флаг, поэтому вам нужно сделать это.

x.ToAmmount = 24.0f;
x.ToAmmountSpecified = true;
// etc for the rest of the poperties
0 голосов
/ 28 ноября 2008

Насколько я понимаю, nillable = "true" генерирует xsi: nil = "true" в XML-значении, если значение отсутствует, что означает, что элемент всегда создается, даже если значение равно нулю.

Попробуйте удалить атрибут nillable и оставить minOccurs = "0". Хотя не пробовал.

0 голосов
/ 19 ноября 2008

Эта схема не определяет тип документа xml. Он просто предоставляет объявление для типа «комбекс» с именем «Необязательно», но ссылки на этот тип нигде нет.

У определяемого XML-документа должен быть хотя бы верхний элемент. этот верхний элемент должен быть определен где-то (в глобальной области видимости). В предоставленной схеме такого определения нет.

Минимальный пример XML-схемы, которая похожа на предоставленную, но определяет XML-документ, такова:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema 
    elementFormDefault="qualified"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>
  <xsd:element name="Optional" type="Optional"/>
  <xsd:complexType name="Optional">
    <xsd:sequence>
      <xsd:element name="FromAmount" nillable="true" type="xsd:float" minOccurs="0" />
      <xsd:element name="ToAmount" nillable="true" type="xsd:float" minOccurs="0" />
      <xsd:element name="FromDate" nillable="true" type="xsd:dateTime" minOccurs="0" />
      <xsd:element name="ToDate" nillable="true" type="xsd:dateTime" minOccurs="0" />
      <xsd:element name="FromCheckNumber" nillable="true" type="xsd:long" minOccurs="0" />
      <xsd:element name="ToCheckNumber" nillable="true" type="xsd:long" minOccurs="0" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

и самый простой XML-документ, который может быть успешно проверен по этой схеме, - просто

<Optional/>

(поскольку все дочерние элементы верхнего элемента определены как необязательные).

Надеюсь, это помогло.

Приветствия

Димитр Новатчев

...