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

Я абсолютный нуб, когда дело доходит до сообщений 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 Ответ

0 голосов
/ 29 сентября 2010

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

...