none
Deserializar XML en objeto c# RRS feed

  • Pregunta

  • Hola que tal tengo mi xml asi:

    "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n
    <loginTicketResponse version=\"1.0\">\n
        <header>\n
            <source>CN=wsaahomo, O=AFIP, C=AR, SERIALNUMBER=CUIT 33693450239</source>\n
            <destination>SERIALNUMBER=CUIT 23083506679, CN=amebstest</destination>\n
            <uniqueId>2267550144</uniqueId>\n
            <generationTime>2019-02-27T10:35:53.654-03:00</generationTime>\n
            <expirationTime>2019-02-27T22:35:53.654-03:00</expirationTime>\n
        </header>\n
        <credentials>\n
            <token>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pgo8c3NvIHZlcnNpb249IjIuMCI
    +CiAgICA8aWQgc3JjPSJDTj13c2FhaG9tbywgTz1BRklQLCBDPUFSLCBTRVJJQUxOVU1CRVI9Q1VJVCAzMzY5MzQ1MDIzOSIgZHN0PSJDTj13c2ZlL
    CBPPUFGSVAsIEM9QVIiIHVuaXF1ZV9pZD0iMzg3MjU1MTA0NSIgZ2VuX3RpbWU9IjE1NTEyNzQ0OTMiIGV4cF90aW1lPSIxNTUxMzE3NzUzIi8+CiAgICA8b3
    BlcmF0aW9uIHR5cGU9ImxvZ2luIiB2YWx1ZT0iZ3JhbnRlZCI+CiAgICAgICAgPGxvZ2luIGVudGl0eT0iMzM2OTM0NTAyMzkiIHNlcnZpY2U9IndzZmUiIHV
    pZD0iU0VSSUFMTlVNQkVSPUNVSVQgMjMwODM1MDY2NzksIENOPWFtZWJzdGVzdCIgYXV0aG1ldGhvZD0iY21zIiByZWdtZXRob2Q9IjIyIj4KICAgICAgICAg
    ICAgPHJlbGF0aW9ucz4KICAgICAgICAgICAgICAgIDxyZWxhdGlvbiBrZXk9IjIzMDgzNTA2Njc5IiByZWx0eXBlPSI0Ii8+CiAgICAgICAgICAgIDwvcmVsY
    XRpb25zPgogICAgICAgIDwvbG9naW4+CiAgICA8L29wZXJhdGlvbj4KPC9zc28+Cg==</token>\n
            <sign>oK0R9qRpc0/iu0WDQU0T8j7vNKl9LkQ9IlSAKKQtp8YkGDqgLePksPZtlrwNIqDrWImbI5iu16xrsQDKRmpCMuj1ajc/Ou1LVUIJ0vc5ff
    gaz/XPrUXdY+frfJbgevR4f4cVnqMeuobo4fLHyrr9vWMTdzC87jhAOIX1gZs/aaE=</sign>\n
        </credentials>\n
    </loginTicketResponse>\n"

    Resulta que lo quiero deserializar para tratarlo como objeto y tengo la siguiente estructura:

            [Serializable()]
            public class Header
            {
                [System.Xml.Serialization.XmlElementAttribute("source")]
                public string source { get; set; }

                [System.Xml.Serialization.XmlElementAttribute("destination")]
                public string destination { get; set; }

                [System.Xml.Serialization.XmlElementAttribute("uniqueId")]
                public string uniqueId { get; set; }

                [System.Xml.Serialization.XmlElementAttribute("generationTime")]
                public string generationTime { get; set; }

                [System.Xml.Serialization.XmlElementAttribute("expirationTime")]
                public string expirationTime { get; set; }
            }

            [Serializable()]
            public class Credentials
            {
                [System.Xml.Serialization.XmlElementAttribute("token")]
                public string token { get; set; }

                [System.Xml.Serialization.XmlElementAttribute("sign")]
                public string sign { get; set; }
            }

            [Serializable()]
            public class LoginTicketResponse
            {
                public LoginTicketResponse()
                {
                    header = new Header();
                    credentials = new Credentials();
                }

                [System.Xml.Serialization.XmlElementAttribute("header")]
                public Header header { get; set; }

                [System.Xml.Serialization.XmlElementAttribute("credentials")]
                public Credentials credentials { get; set; }
            }

    Luego cuando lo quiero deserializar ejecuto:

    LoginTicketResponse loginTicketResponse = null;
                string path = @"C:\Users\Usuario\Documents\seba\afip\TA\taPrueba.txt";

                XmlSerializer serializer = new XmlSerializer(typeof(LoginTicketResponse));

                StreamReader reader = new StreamReader(path);
                loginTicketResponse = (LoginTicketResponse)serializer.Deserialize(reader);
                reader.Close();

    Luego de ejecutarlo en la linea:

                loginTicketResponse = (LoginTicketResponse)serializer.Deserialize(reader);

    me levanta una excepcion del tipo 

    InvalidOperationException

    que me dice "Error en el documento XML (1, 15)."

    Nose si estoy declarando bien la estructura o que.


    • Editado SJaliff miércoles, 27 de febrero de 2019 15:36
    miércoles, 27 de febrero de 2019 15:35

Respuestas

  • Te da el error en la fila 1 columna 15, que resulta ser el sitio en el que tienes la version \"1.0\".

    ¿No será que el XML realmente contiene las contrabarras? Es decir,, cuando escribes el string en C# se "escapan" las comillas anteponiéndoles una \, pero cuando el string está guardado en el archivo taPrueba.txt no debe contener esos caracters de escape.

    Abre el fichero taPrueba.txt con el notepad y cerciórate de que no contiene caracteres de escape. No lo hagas con el debugger de Visual Studio porque entonces es el propio debugger el que introduce los escapes para mostrarte el string, aunque el string no los contenga en realidad.

    • Marcado como respuesta SJaliff miércoles, 27 de febrero de 2019 16:47
    miércoles, 27 de febrero de 2019 16:08
    Moderador
  • Así a simple vista el documento parece correcto. Pero se te queja en la fila 2 columna 2, que es justo donde empieza el primer elemento. Mi sospecha es que puede haber algún carácter oculto justo en el salto de línea (entre la primera y la segunda) o justo detrás del < de la segunda línea. Prueba a abrir el fichero con un editor binario (el propio Visual Studio tiene uno si le dices "abrir con...") y mira a ver qué bytes tienes en ese punto o cerca del mismo.
    • Marcado como respuesta SJaliff jueves, 28 de febrero de 2019 16:42
    miércoles, 27 de febrero de 2019 19:02
    Moderador

Todas las respuestas

  • Te da el error en la fila 1 columna 15, que resulta ser el sitio en el que tienes la version \"1.0\".

    ¿No será que el XML realmente contiene las contrabarras? Es decir,, cuando escribes el string en C# se "escapan" las comillas anteponiéndoles una \, pero cuando el string está guardado en el archivo taPrueba.txt no debe contener esos caracters de escape.

    Abre el fichero taPrueba.txt con el notepad y cerciórate de que no contiene caracteres de escape. No lo hagas con el debugger de Visual Studio porque entonces es el propio debugger el que introduce los escapes para mostrarte el string, aunque el string no los contenga en realidad.

    • Marcado como respuesta SJaliff miércoles, 27 de febrero de 2019 16:47
    miércoles, 27 de febrero de 2019 16:08
    Moderador
  • Puede ser alberto lo que decis, es mas ahora modifique el xml asi en el txt

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <loginTicketResponse version="1.0">
        <header>
            <source>CN=wsaahomo, O=AFIP, C=AR, SERIALNUMBER=CUIT 33693450239</source>
            <destination>SERIALNUMBER=CUIT 23083506679, CN=amebstest</destination>
            <uniqueId>2267550144</uniqueId>
            <generationTime>2019-02-27T10:35:53.654-03:00</generationTime>
            <expirationTime>2019-02-27T22:35:53.654-03:00</expirationTime>
        </header>
        <credentials>
            <token>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pgo8c3NvIHZlcnNpb249IjIuMCI
    +CiAgICA8aWQgc3JjPSJDTj13c2FhaG9tbywgTz1BRklQLCBDPUFSLCBTRVJJQUxOVU1CRVI9Q1VJVCAzMzY5MzQ1MDIzOSIgZHN0PSJDTj13c2ZlL
    CBPPUFGSVAsIEM9QVIiIHVuaXF1ZV9pZD0iMzg3MjU1MTA0NSIgZ2VuX3RpbWU9IjE1NTEyNzQ0OTMiIGV4cF90aW1lPSIxNTUxMzE3NzUzIi8+CiAgICA8b3
    BlcmF0aW9uIHR5cGU9ImxvZ2luIiB2YWx1ZT0iZ3JhbnRlZCI+CiAgICAgICAgPGxvZ2luIGVudGl0eT0iMzM2OTM0NTAyMzkiIHNlcnZpY2U9IndzZmUiIHV
    pZD0iU0VSSUFMTlVNQkVSPUNVSVQgMjMwODM1MDY2NzksIENOPWFtZWJzdGVzdCIgYXV0aG1ldGhvZD0iY21zIiByZWdtZXRob2Q9IjIyIj4KICAgICAgICAg
    ICAgPHJlbGF0aW9ucz4KICAgICAgICAgICAgICAgIDxyZWxhdGlvbiBrZXk9IjIzMDgzNTA2Njc5IiByZWx0eXBlPSI0Ii8+CiAgICAgICAgICAgIDwvcmVsY
    XRpb25zPgogICAgICAgIDwvbG9naW4+CiAgICA8L29wZXJhdGlvbj4KPC9zc28+Cg==</token>
            <sign>oK0R9qRpc0/iu0WDQU0T8j7vNKl9LkQ9IlSAKKQtp8YkGDqgLePksPZtlrwNIqDrWImbI5iu16xrsQDKRmpCMuj1ajc/Ou1LVUIJ0vc5ff
    gaz/XPrUXdY+frfJbgevR4f4cVnqMeuobo4fLHyrr9vWMTdzC87jhAOIX1gZs/aaE=</sign>
        </credentials>
    </loginTicketResponse>

    Le saque todas las barras invertidas, pero ahora me tira un error de este tipo "Error en el documento XML (2, 2)."

    Sabes que puede llegar a ser?

    miércoles, 27 de febrero de 2019 16:30
  • Así a simple vista el documento parece correcto. Pero se te queja en la fila 2 columna 2, que es justo donde empieza el primer elemento. Mi sospecha es que puede haber algún carácter oculto justo en el salto de línea (entre la primera y la segunda) o justo detrás del < de la segunda línea. Prueba a abrir el fichero con un editor binario (el propio Visual Studio tiene uno si le dices "abrir con...") y mira a ver qué bytes tienes en ese punto o cerca del mismo.
    • Marcado como respuesta SJaliff jueves, 28 de febrero de 2019 16:42
    miércoles, 27 de febrero de 2019 19:02
    Moderador