2008-11-18 5 views
1

У меня есть веб-приложение .NET, которое использует веб-службу на основе Java. Один из объектов с именем «Дополнительно» содержит поля критериев поиска. Схема выглядит следующим образом:Проблема с сериализацией XML для minoccurs

<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

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

x.ToAmmount = 24.0f; 
x.ToAmmountSpecified = true; 
// etc for the rest of the poperties 
0

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

Определяемый документ 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/>

(так как все дети верхнего элемента определяется как неавтоматического Рациональная).

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

Приветствие,

Dimitre Novatchev

+0

Dimitre, Благодарим за отзыв. Я прошу прощения за то, что не пояснил, что размещенный xml - это всего лишь выдержка из WSDL. Документ хорошо сформирован, но я не опубликовал весь WSDL, потому что я не думал, что он имеет отношение к проблеме, с которой я столкнулся. – Mondo 2008-11-19 15:48:44

+0

Mondo, спасибо за это. Как насчет того, чтобы определить проблему еще лучше? Правильное определение проблемы является необходимой предпосылкой для всех, кто ее понимает и может помочь. – 2008-11-20 04:22:17

0

Я понимаю, что nillable = «истина» порождает XSI: ноль = «истина» в значении XML, если значение не присутствует, а это означает, что элемент всегда создается, даже если значение равно нулю ,

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

Смежные вопросы