Мыло - Элемент не имеет xsi:nil в качестве свойства, но десериализация не делает объект не нулевым

Я абсолютный нуб, когда дело доходит до сообщений XML и SOAP.... Вот сообщение SOAP.

<?xml version="1.0" encoding="utf-8" ?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <CR>
            <Username xmlns="<Hidden>">mtas</Username>
            <Password xmlns="<Hidden>">password</Password>
            <id xmlns="<Hidden>">
                70dad12b-bb50-402d-8b34-
                fe2d4c0c283d
            </id>
            <Data xmlns="<Hidden>">
                <Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                xmlns="<Hidden>">
                    <CS>
                        <CSCallbackRequest xmlns="">
                            <CDS xsi:nil="true" xmlns="<Hidden>"/>
                            <CDRP xmlns="<Hidden>"/>
                            <UDI xsi:nil="true"
                            xmlns="<Hidden>"/>
                        </CSCallbackRequest>
                    </CS>
                    <Fault xsi:nil="true" />
                    <Comment xsi:nil="true"/>
                </Data>
            </Data>
        </CR>
    </s:Body>
</s:Envelope>

Мы сгенерировали классы с помощью инструмента xsd.exe, который дал нам классы для десериализации. Этот файл.xsd был предоставлен компанией, от которой мы получаем сообщения SOAP.

Здесь проблема. Когда мы получаем ответ такого типа от компании, мы ищем в CSCallbackRequest эти три элемента: CDS, CDRP и UDI. Мы пытаемся определить, какой тип обратного вызова мы получаем. Мое первоначальное предположение было, когда мы использовали XMLSerializer с типом (тип сгенерированного класса), элемент в CSCallbackRequest, у которого нет xsi:nil=true, позволил бы объекту внутри объекта сгенерированного типа типа НЕ быть нулевым. Но это не так. Как проверить, не имеет ли свойство с параметром xsi: nil после десериализации?

1 ответ

Решение

Собственно, я разобрался в проблеме. Сообщение SOAP, которое я здесь разместил, на самом деле является примером из документации компании. Я пытался использовать это как макет для сообщения, которое мы получим. После сравнения сгенерированных файлов классов из XSD я заметил, что <CS> фактически не было определено в файлах. Когда он десериализуется, он не найдет этот элемент, поэтому ничего не заполняет, так как мы начали десериализацию из <Data> элемент и за его пределами. Я проверил другие примеры в документации, и у них не было этого дополнительного <CS> элемент. Удаление этого элемента решило всю эту проблему. Я уведомил компанию об их ошибке в документации.

Другие вопросы по тегам