{” no se esperaba.} Deserialización de Twitter XML

Así que estoy tirando del XML de Twitter a través de OAuth

Así que estoy haciendo una solicitud a http://twitter.com/account/verify_credentials.xml

Lo cual devuelve el siguiente XML

  16434938 Lloyd Sparkes lloydsparkes Hockley, Essex, UK Student http://sofes.miximages.com/c%23/twitterProfilePhoto_normal.jpg http://www.lloydsparkes.co.uk false 115 9fdaf4 000000 220f7b FFF7CC F2E195 87 Wed Sep 24 14:26:09 +0000 2008 0 0 London http://s.twimg.com/a/1255366924/images/themes/theme12/bg.gif false 1965 false false false false  Mon Oct 12 19:23:47 +0000 2009 4815268670 » @alexmuller your kidding? it should all be "black tie" dress code <a href="http://code.google.com/p/wittytwitter/" rel="nofollow">Witty</a> false 4815131457 8645442 false alexmuller    

Estoy usando el siguiente código para deserializar

  public User VerifyCredentials() { string url = "http://twitter.com/account/verify_credentials.xml"; string xml = _oauth.oAuthWebRequestAsString(oAuthTwitter.Method.GET, url, null); XmlSerializer xs = new XmlSerializer(typeof(User),""); MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml)); return (User)xs.Deserialize(ms); } 

Y tengo lo siguiente para mi clase de usuario

  [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] public partial class User { [XmlElement(ElementName = "id")] public long Id { get; set; } [XmlElement(ElementName = "name")] public string Name { get; set; } [XmlElement(ElementName = "screen_name")] public string ScreenName { get; set; } [XmlElement(ElementName = "location")] public string Location { get; set; } [XmlElement(ElementName = "description")] public string Description { get; set; } [XmlElement(ElementName = "profile_image_url")] public string ProfileImageUrl { get; set; } [XmlElement(ElementName = "url")] public string Url { get; set; } [XmlElement(ElementName = "protected")] public bool Protected { get; set; } [XmlElement(ElementName = "followers_count")] public int FollowerCount { get; set; } [XmlElement(ElementName = "profile_background_color")] public string ProfileBackgroundColor { get; set; } [XmlElement(ElementName = "profile_text_color")] public string ProfileTextColor { get; set; } [XmlElement(ElementName = "profile_link_color")] public string ProfileLinkColor { get; set; } [XmlElement(ElementName = "profile_sidebar_fill_color")] public string ProfileSidebarFillColor { get; set; } [XmlElement(ElementName = "profile_sidebar_border_color")] public string ProfileSidebarBorderColor { get; set; } [XmlElement(ElementName = "friends_count")] public int FriendsCount { get; set; } [XmlElement(ElementName = "created_at")] public string CreatedAt { get; set; } [XmlElement(ElementName = "favourties_count")] public int FavouritesCount { get; set; } [XmlElement(ElementName = "utc_offset")] public int UtcOffset { get; set; } [XmlElement(ElementName = "time_zone")] public string Timezone { get; set; } [XmlElement(ElementName = "profile_background_image_url")] public string ProfileBackgroundImageUrl { get; set; } [XmlElement(ElementName = "profile_background_tile")] public bool ProfileBackgroundTile { get; set; } [XmlElement(ElementName = "statuese_count")] public int StatusesCount { get; set; } [XmlElement(ElementName = "notifications")] public string Notifications { get; set; } [XmlElement(ElementName = "geo_enabled")] public bool GeoEnabled { get; set; } [XmlElement(ElementName = "Verified")] public bool Verified { get; set; } [XmlElement(ElementName = "following")] public string Following { get; set; } [XmlElement(ElementName = "status", IsNullable=true)] public Status CurrentStatus { get; set; } } 

Pero cuando se deserializa el Xml anterior, aparece el siguiente error lanzado

  • $ exception {“Hay un error en el documento XML (2, 2).”} System.Exception {System.InvalidOperationException}

  • InnerException {” no se esperaba.”} System.Exception {System.InvalidOperationException}

Ahora he buscado y la mejor solución que puedo encontrar es agregar espacios de nombres en blanco al serializador, cuando serializas el contenido, PERO no estoy serializándolo así que no puedo.

También tengo un código para recibir estados, que funciona bien.

Entonces, ¿alguien me puede explicar qué y por qué está sucediendo el error? ¿Además de una posible solución?

Gracias por adelantado

Ya sea decorar su entidad raíz con el atributo XmlRoot que se utilizará en tiempo de comstackción.

 [XmlRoot(Namespace = "www.contoso.com", ElementName = "MyGroupName", DataType = "string", IsNullable=true)] 

O especifique el atributo raíz al de serializar en tiempo de ejecución.

 XmlRootAttribute xRoot = new XmlRootAttribute(); xRoot.ElementName = "user"; // xRoot.Namespace = "http://www.cpandl.com"; xRoot.IsNullable = true; XmlSerializer xs = new XmlSerializer(typeof(User),xRoot); 

Aún más fácil es solo agregar las siguientes anotaciones a la parte superior de su clase:

 [Serializable, XmlRoot("user")] public partial class User { } 
 XmlSerializer xs = new XmlSerializer(typeof(User), new XmlRootAttribute("yourRootName")); 

El mensaje de error es tan vago, para mí tenía este código:

 var streamReader = new StreamReader(response.GetResponseStream()); var xmlSerializer = new XmlSerializer(typeof(aResponse)); theResponse = (bResponse) xmlSerializer.Deserialize(streamReader); 

Tenga en cuenta que xmlSerializer se crea una instancia con una Respuesta, pero al deserializar, lo lancé accidentalmente a bResonse.

Como dice John Saunders, compruebe si los nombres de clase / propiedad coinciden con la mayúscula de su XML. Si este no es el caso, el problema también ocurrirá.

La mejor y más simple solución es simplemente usar el atributo XMLRoot en su clase, en el que desea desrealizar.

Me gusta:

 [XmlRoot(ElementName = "YourPreferableNameHere")] public class MyClass{ ... } 

También use la siguiente DLL :

 using System.Xml.Serialization; 

Mi problema era que uno de mis elementos tenía el atributo xmlns:

 < ?xml version="1.0" encoding="utf-8"?>   ...   

No importa lo que intenté, el atributo xmlns parecía estar rompiendo el serializador, así que eliminé cualquier rastro de xmlns = “…” del archivo xml:

 < ?xml version="1.0" encoding="utf-8"?>   ...   

¡y voilá! Todo funcionó.

Ahora analizo el archivo xml para eliminar este atributo antes de deserializarlo. No estoy seguro de por qué funciona esto, tal vez mi caso sea diferente ya que el elemento que contiene el atributo xmlns no es el elemento raíz.

Lo único que funcionó en mi caso fue usar el código de David de San Valentín. Usando Root Attr. en la clase Persona no ayudó.

Tengo este simple Xml:

 < ?xml version="1.0"?>   AAAA BBB   CCC DDD   

Clase C #:

 public class Person { public string FirstName { get; set; } public string LastName { get; set; } } 

Código de des-serialización C # de un método principal:

 XmlRootAttribute xRoot = new XmlRootAttribute(); xRoot.ElementName = "personList"; xRoot.IsNullable = true; using (StreamReader reader = new StreamReader(xmlFilePath)) { List result = (List)(new XmlSerializer(typeof(List), xRoot)).Deserialize(reader); int numOfPersons = result.Count; } 

Mi problema era que el elemento raíz en realidad tiene un xmlns = “abc123”

Así que tuve que hacer XmlRoot (“elementname”, NameSpace = “abc123”)

Mi situación era que estaba trabajando en un trabajo donde el código estaba en VB.NET, y una rutina que deserializaba objetos de cadenas xml había funcionado de maravilla para docenas de usos, pero ayer no se pudo con el “usuario xmlns = ” no se esperaba error (cuando se arrojó una cadena xml que era la serialización de un objeto que tenía una propiedad que era, en sí misma, un objeto serializado). Las respuestas anteriores me ayudaron a resolver esto tomando esta rutina que había estado funcionando …

 ' DESERIALIZE OBJECT FROM XML STRING Public Shared Function DeserializeFromXml(Of T)(ByVal xml As String) As T Dim response As T = Nothing Try Using reader As TextReader = New StringReader(xml) response = DirectCast(New XmlSerializer(GetType(T)).Deserialize(reader), T) End Using Catch ex As Exception End Try Return response End Function 

… copie ese código y cree una nueva rutina que le permita a la persona que llama proporcionar una cadena de “Nombre de atributo raíz”. La nueva rutina deserializó el objeto ‘problema’ de su cadena xml serializada sin errores:

 ' DESERIALIZE OBJECT FROM XML STRING, SUPPLYING A ROOT ATTRIBUTE ELEMENT NAME Public Shared Function DeserializeFromXmlWithRootAttribute(Of T)(ByVal xml As String, ByVal rootAttributeName As String) As T Dim response As T = Nothing Try Using reader As TextReader = New StringReader(xml) Dim xra As New XmlRootAttribute() xra.ElementName = rootAttributeName xra.IsNullable = True response = DirectCast(New XmlSerializer(GetType(T), xra).Deserialize(reader), T) End Using Catch ex As Exception End Try Return response End Function