Веб-сервис отправляет null в целочисленные поля

Я пытаюсь использовать сторонний веб-сервис. Одно из возвращаемых полей определяется как

<s:element name="SomeField" minOccurs="0" maxOccurs="1" type="s:int"/> 

В ответе SOAP они отправляют поле как

<SomeField/>

Это приводит к тому, что десериализатор .Net выдает исключение, поскольку пустой элемент xml не является допустимым целым числом.

Каков наилучший способ справиться с этим?

Я попытался настроить wsdl, чтобы пометить поле как обнуляемое, что помечает сгенерированные поля как int? но десериализатор все еще терпит неудачу.

Я могу реализовать конечную точку либо как ссылку на службу, либо как ссылку на веб-службу.


person Darryl Braaten    schedule 31.05.2011    source источник


Ответы (3)


Я не думаю, что десериализатор .Net справится с этим.

Как насчет настройки определения SomeField на строку. Таким образом можно проверить нулевое значение, но вам придется выполнить Int32.Parse для реального значения.

<s:element name="SomeField" minOccurs="0" maxOccurs="1" type="s:string"/> 

Аксессор может быть:

 void int? GetSomeField()
 {
     if (someField == null) return null;
     return In32.Parse(someField);
 }
person Richard Schneider    schedule 31.05.2011

Вы можете установить значение по умолчанию на 0. Таким образом, если значение не установлено, оно отправит 0.

<s:element name="SomeField" minOccurs="0" maxOccurs="1" default="0" type="s:int"/> 
person Shiraz Bhaiji    schedule 31.05.2011
comment
Я думаю, что это сработало бы, если бы мне не нужно было обрабатывать нули и 0 по-разному. - person Darryl Braaten; 01.06.2011

Это ошибка в их коде. Это не соответствует схеме. XMLSpy говорит:

File Untitled6.xml is not valid.
Value '' is not allowed for element <SomeField>.
    Hint: A valid value would be '0'.
    Error location: root / SomeField
    Details
        cvc-datatype-valid.1.2.1: For type definition 'xs:int' the string '' does not match a literal in the lexical space of built-in type definition 'xs:int'.
        cvc-simple-type.1: For type definition 'xs:int' the string '' is not valid.
        cvc-type.3.1.3: The normalized value '' is not valid with respect to the type definition 'xs:int'.
        cvc-elt.5.2.1: The element <SomeField> is not valid with respect to the actual type definition 'xs:int'.

Я получил это со следующей схемой:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="root">
        <xs:annotation>
            <xs:documentation>Comment describing your root element</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
            <xs:element name="SomeField" minOccurs="0" maxOccurs="1" type="xs:int"/> 
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

и следующий XML:

<?xml version="1.0" encoding="UTF-8"?>
<root xsi:noNamespaceSchemaLocation="Untitled5.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <SomeField/>
</root>
person Community    schedule 31.05.2011
comment
Согласен, но это не мой код, который нужно менять, поэтому мне нужно его обойти. - person Darryl Braaten; 01.06.2011
comment
Одной из ваших обязанностей как потребителя этих данных является сообщение об ошибках. Это ошибка. Сообщите об этом, а затем обойдите это — не просто обходите это и не сообщайте им об их ошибке. Одна из причин, по которой вы видите эту ошибку, может заключаться в том, что никто не сообщил им об этом. - person John Saunders; 01.06.2011
comment
Да, все экземпляры этого были отправлены поставщику. Хотя, по их мнению, это проблема парсера Microsoft SOAP, а не их вывода. У меня сейчас работает. Если они исправят свой конец, это сделает мою сторону чище и не сломает новых разработчиков, если они получат от них новый WSDL. - person Darryl Braaten; 01.06.2011
comment
Укажите им этот ответ: это от XMLSpy, а не от Microsoft. - person John Saunders; 01.06.2011