Ошибка в XML документе (0, 0) - Ошибка десериализации XML в объект - PullRequest
1 голос
/ 04 августа 2020

, пожалуйста, посоветуйте, как сопоставить ответ с классом, потому что из каждого примера, с которым я сталкивался, тело всегда не имеет символа, такого как core:transactionResponse

мой код:

string fileName = @"C:\Users\Lenovo\Downloads\GLResponseXml.xml";
        XDocument xDoc = XDocument.Load(fileName);

        var unwrappedResponse = xDoc.Descendants((XNamespace)"http://schemas.xmlsoap.org/soap/envelope/" + "Body")
                                .First()
                                .FirstNode;

        XmlSerializer xmlSerializer = new XmlSerializer(typeof(TransactionResponse));
        TransactionResponse response = (TransactionResponse)xmlSerializer.Deserialize(xDoc.Descendants((XNamespace)"http://schemas.xmlsoap.org/soap/envelope/" + "Body")
            .First()
            .FirstNode
            .CreateReader()
        );

для десерализируя это soap xml:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dpss0="bons">
    <soapenv:Header/>
    <soapenv:Body>
        <core:transactionResponse xmlns:bo="http://service.example.co.id/core/bo" xmlns:core="http://service.example.co.id/core">
            <response>
                <header>
                    <coreJournal>149326</coreJournal>
                </header>
                <content xsi:type="bo:OKMessage">
                    <message/>
                </content>
            </response>
        </core:transactionResponse>
    </soapenv:Body>
   </soapenv:Envelope>

, но я получил эту ошибку: InvalidOperationException: <transactionResponse xmlns='http://service.example.co.id/core'> was not expected.

Я отображаю ответ в этот класс:

public class GLXmlResponse
{
    [XmlRoot(ElementName = "response")]
    public class Response
    {
        [XmlElement(ElementName = "header")]
        public Header Header { get; set; }
        [XmlElement(ElementName = "content")]
        public Content Content { get; set; }
    }

    [XmlRoot(ElementName = "header")]
    public class Header
    {
        [XmlElement(ElementName = "coreJournal")]
        public string CoreJournal { get; set; }
    }

    [XmlRoot(ElementName = "content")]
    public class Content
    {
        [XmlElement(ElementName = "message")]
        public string Message { get; set; }
        [XmlAttribute(AttributeName = "type", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
        public string Type { get; set; }
    }

    [XmlRoot(ElementName = "transactionResponse", Namespace = "http://service.example.co.id/core")]
    public class TransactionResponse
    {
        [XmlElement(ElementName = "response")]
        public Response Response { get; set; }
        [XmlAttribute(AttributeName = "bo", Namespace = "http://www.w3.org/2000/xmlns/")]
        public string Bo { get; set; }
        [XmlAttribute(AttributeName = "core", Namespace = "http://www.w3.org/2000/xmlns/")]
        public string Core { get; set; }
    }

    [XmlRoot(ElementName = "Body", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
    public class Body
    {
        [XmlElement(ElementName = "transactionResponse", Namespace = "http://service.example.co.id/core")]
        public TransactionResponse TransactionResponse { get; set; }
    }

    [XmlRoot(ElementName = "Envelope", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
    public class Envelope
    {
        [XmlElement(ElementName = "Header", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
        public string Header { get; set; }
        [XmlElement(ElementName = "Body", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
        public Body Body { get; set; }
        [XmlAttribute(AttributeName = "soapenv", Namespace = "http://www.w3.org/2000/xmlns/")]
        public string Soapenv { get; set; }
        [XmlAttribute(AttributeName = "soapenc", Namespace = "http://www.w3.org/2000/xmlns/")]
        public string Soapenc { get; set; }
        [XmlAttribute(AttributeName = "xsd", Namespace = "http://www.w3.org/2000/xmlns/")]
        public string Xsd { get; set; }
        [XmlAttribute(AttributeName = "xsi", Namespace = "http://www.w3.org/2000/xmlns/")]
        public string Xsi { get; set; }
        [XmlAttribute(AttributeName = "dpss0", Namespace = "http://www.w3.org/2000/xmlns/")]
        public string Dpss0 { get; set; }
    }
}

нужна помощь в настройке объекта класса

1 Ответ

0 голосов
/ 04 августа 2020

Я не могу воспроизвести точную ошибку, которую вы видите, поэтому вы можете проверить ее с помощью минимального воспроизведения; Я использую:

var env = (GLXmlResponse.Envelope)new XmlSerializer(typeof(GLXmlResponse.Envelope))
    .Deserialize(new StringReader(xml));        
System.Console.WriteLine(env.Body.TransactionResponse.Response.Header.CoreJournal);

, где:

string xml = @"<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:soapenc=""http://schemas.xmlsoap.org/soap/encoding/"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:dpss0=""bons"">
<soapenv:Header/>
<soapenv:Body>
    <core:transactionResponse xmlns:bo=""http://service.example.co.id/core/bo"" xmlns:core=""http://service.example.co.id/core"">
        <response>
            <header>
                <coreJournal>149326</coreJournal>
            </header>
            <content xsi:type=""bo:OKMessage"">
                <message/>
            </content>
        </response>
    </core:transactionResponse>
</soapenv:Body></soapenv:Envelope>";

, в котором просто null вместо .Response. Причина для , что , заключается в том, что он фактически находится в пустом пространстве имен (префиксы не наследуются), поэтому вам нужно

[XmlElement(ElementName = "response", Namespace = "")]
public Response Response { get; set; }

Однако это вызывает проблему с OKMessage в формате xml. Если я закомментирую <content>, тогда он сработает, и я смогу увидеть результат 149326.

Однако было бы проще начать, просто скопировав xml в в буфер обмена, Edit -> Paste Special -> Paste XML As Classes, и посмотрите, что он генерирует, и работайте оттуда.

...