Get data return xml

1

I'm trying to return the data from this xml:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<GerarNfseResposta xmlns="http://www.betha.com.br/e-nota-contribuinte-ws">
    <ListaMensagemRetorno>
        <MensagemRetorno>
            <Codigo>00000</Codigo>
            <Mensagem>00000 - O RPS 8964 da série 999 já foi informado em outra nota fiscal.</Mensagem>
        </MensagemRetorno>
    </ListaMensagemRetorno>
</GerarNfseResposta>

I'm trying to do it this way:

WebResponse webResponse = webRequest.GetResponse();
StreamReader rd = new StreamReader(webResponse.GetResponseStream());
soapResult = rd.ReadToEnd();

XmlDocument xmlResponse = new XmlDocument();
xmlResponse.LoadXml(soapResult);
XmlNode responseNode = xmlResponse.LastChild.LastChild.FirstChild;

XmlNamespaceManager ns = new XmlNamespaceManager(xmlResponse.NameTable);
ns.AddNamespace("ns2", "http://www.betha.com.br/e-nota-contribuinte-ws");
XmlNode codigo = xmlResponse.SelectSingleNode("//ns2:Codigo", ns);
XmlNode mensagem = xmlResponse.SelectSingleNode("//ns2:Mensagem", ns);

But the code and message always comes null.

I tried this way below:

 string soapResult = string.Empty;

        WebResponse webResponse = webRequest.GetResponse();
        StreamReader rd = new StreamReader(webResponse.GetResponseStream());
        soapResult = rd.ReadToEnd();

        XmlDocument xmlResponse = new XmlDocument();
        xmlResponse.LoadXml(soapResult);
        XNamespace ns = XNamespace
.Get("http://www.betha.com.br/e-nota-contribuinte-ws");

         soapResult = System.IO.File.ReadAllText(soapResult,
            System.Text.Encoding.GetEncoding("ISO-8859-1"));

        var xDoc = XDocument.Parse(soapResult)
                .Descendants(ns + "ListaMensagemRetorno")
                .Elements(ns + "MensagemRetorno")
                .Select(x => new
                {
                    Codigo = x.Element(ns + "Codigo")?.Value,
                    Mensagem = x.Element(ns + "Mensagem")?.Value
                })
                .ToList();

But it also was not valid, I tried to remove this line soapResult = System.IO.File.ReadAllText(soapResult, System.Text.Encoding.GetEncoding("ISO-8859-1")); however comes null

I tried to get it this way too and it did not work:

System.Xml.XmlNode Gerar = xmlResponse.SelectSingleNode("GerarNfseResposta"); System.Xml.XmlNode ListaMensagemRetorno = Gerar.SelectSingleNode("ListaMensagemRetorno"); System.Xml.XmlNode MensagemRetorno = ListaMensagemRetorno.SelectSingleNode("MensagemRetorno")

I tried this way too, but it always comes null.

XmlNodeList xnList = xmlResponse.SelectNodes("/GerarNfseResposta/ListaMensagemRetorno/MensagemRetorno");
        foreach (XmlNode xn in xnList)
        {
            string firstName = xn["Codigo"].InnerText;
            string lastName = xn["Mensagem"].InnerText;
            Console.WriteLine("Name: {0} {1}", firstName, lastName);
        }

XML Return:

 <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Header></env:Header><env:Body><ns2:GerarNfseResponse xmlns:ns2="http://www.betha.com.br/e-nota-contribuinte-ws"><return>&lt;?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?&gt;
&lt;GerarNfseResposta xmlns="http://www.betha.com.br/e-nota-contribuinte-ws"&gt;
    &lt;ListaMensagemRetorno&gt;
        &lt;MensagemRetorno&gt;
            &lt;Codigo&gt;00000&lt;/Codigo&gt;
            &lt;Mensagem&gt;00000 - O RPS 8965 da série 999 já foi informado em outra nota fiscal.&lt;/Mensagem&gt;
        &lt;/MensagemRetorno&gt;
    &lt;/ListaMensagemRetorno&gt;
&lt;/GerarNfseResposta&gt;
</return></ns2:GerarNfseResponse></env:Body></env:Envelope>
    
asked by anonymous 18.12.2018 / 13:48

1 answer

3

One solution is XDocument of the namespace System.Xml.Linq , example :

XNamespace ns = XNamespace
    .Get("http://www.betha.com.br/e-nota-contribuinte-ws"); 

string soapResult = System.IO.File.ReadAllText(@"./data.xml", 
    System.Text.Encoding.GetEncoding("ISO-8859-1"));

var xDoc = XDocument.Parse(soapResult, LoadOptions.None)
        .Descendants(ns + "ListaMensagemRetorno")
        .Elements(ns + "MensagemRetorno")
        .Select(x => new
        {
            Codigo = x.Element(ns + "Codigo")?.Value,
            Mensagem = x.Element(ns + "Mensagem")?.Value
        })
        .ToList();

Remembering any that has a namespace to retrieve your information should also be passed. Another factor is that this has enconding ISO-8859-1 which must be respected and in its load must also be configured, being responsible for accents and special characters.

18.12.2018 / 15:34