Estoy sacando el XML de Twitter a través de OAuth.
Estoy haciendo una solicitud a http://twitter.com/account/verify_credentials.xml , que devuelve el siguiente XML:
<?xml version="1.0" encoding="UTF-8"?>
<user>
<id>16434938</id>
<name>Lloyd Sparkes</name>
<screen_name>lloydsparkes</screen_name>
<location>Hockley, Essex, UK</location>
<description>Student</description>
<profile_image_url>http://a3.twimg.com/profile_images/351849613/twitterProfilePhoto_normal.jpg</profile_image_url>
<url>http://www.lloydsparkes.co.uk</url>
<protected>false</protected>
<followers_count>115</followers_count>
<profile_background_color>9fdaf4</profile_background_color>
<profile_text_color>000000</profile_text_color>
<profile_link_color>220f7b</profile_link_color>
<profile_sidebar_fill_color>FFF7CC</profile_sidebar_fill_color>
<profile_sidebar_border_color>F2E195</profile_sidebar_border_color>
<friends_count>87</friends_count>
<created_at>Wed Sep 24 14:26:09 +0000 2008</created_at>
<favourites_count>0</favourites_count>
<utc_offset>0</utc_offset>
<time_zone>London</time_zone>
<profile_background_image_url>http://s.twimg.com/a/1255366924/images/themes/theme12/bg.gif</profile_background_image_url>
<profile_background_tile>false</profile_background_tile>
<statuses_count>1965</statuses_count>
<notifications>false</notifications>
<geo_enabled>false</geo_enabled>
<verified>false</verified>
<following>false</following>
<status>
<created_at>Mon Oct 12 19:23:47 +0000 2009</created_at>
<id>4815268670</id>
<text>» @alexmuller your kidding? it should all be "black tie" dress code</text>
<source><a href="http://code.google.com/p/wittytwitter/" rel="nofollow">Witty</a></source>
<truncated>false</truncated>
<in_reply_to_status_id>4815131457</in_reply_to_status_id>
<in_reply_to_user_id>8645442</in_reply_to_user_id>
<favorited>false</favorited>
<in_reply_to_screen_name>alexmuller</in_reply_to_screen_name>
<geo/>
</status>
</user>
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 User
clase:
[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, la aplicación arroja lo siguiente:
$ excepcion {"Hay un error en el documento XML (2, 2)."} System.Exception {System.InvalidOperationException}
InnerException {"<user xmlns = ''> 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 lo estoy serializando, así que no puedo.
También tengo un código para recibir estados, que funciona bien.
Entonces, ¿alguien puede explicarme por qué está ocurriendo el error? ¿Y una posible solución?
Gracias por adelantado.
fuente
XmlSerializer
. Así que revisa eso también.Respuestas:
Decora tu entidad raíz con el atributo XmlRoot que se usará en tiempo de compilación.
O especifique el atributo raíz al deserializar en tiempo de ejecución.
fuente
Aún más fácil es agregar las siguientes anotaciones a la parte superior de su clase:
fuente
fuente
El mensaje de error es tan vago, para mí tenía este código:
Observe que xmlSerializer se instancia con aResponse, pero al deserializarlo accidentalmente lo envié a bResonse.
fuente
XmlRoot(..)
en la clase secundariaClassB
de la clase primariaClassA
. Usé ennew XmlSerializer(typeof(ClassA)
lugar de encendidoClassB
y también fundí un objeto. Gracias por señalar!La solución más simple y mejor es usar el atributo XMLRoot en su clase, en la que desea deserializar.
Me gusta:
Además, use el siguiente ensamblaje :
fuente
XmlRoot()
necesita un atributo para solucionar este problema? Aquí hay 5 respuestas que dicen "solo agregue este código" y no una explicación. Las personas responden 7 años después y todavía es solo "Agregar este código XmlRoot". De todas las respuestas elegí la más nueva para pedir una explicación.Como dice John Saunders, verifique 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á.
fuente
Mi problema era que uno de mis elementos tenía el atributo xmlns:
No importa lo que intenté, el atributo xmlns parecía estar rompiendo el serializador, por lo que eliminé cualquier rastro de xmlns = "..." del archivo xml:
¡y voilá! Todo funcionó.
Ahora analizo el archivo xml para eliminar este atributo antes de deserializar. No estoy seguro de por qué esto funciona, quizás mi caso es diferente ya que el elemento que contiene el atributo xmlns no es el elemento raíz.
fuente
Lo único que funcionó en mi caso fue usar el código de David Valentine. Usando Root Attr. en la clase Persona no ayudó.
Tengo este simple Xml:
Clase C #:
Código de deserialización C # de un método principal:
fuente
En mi caso, mi xml tenía múltiples espacios de nombres y atributos. Así que usé este sitio para generar los objetos: https://xmltocsharp.azurewebsites.net/
Y usé el siguiente código para deserializar
fuente
Mi problema fue que el elemento raíz en realidad tiene un xmlns = "abc123"
Así que tuve que hacer XmlRoot ("elementname", NameSpace = "abc123")
fuente
Todo lo anterior no funcionó para mí, pero esto fue: Verifique que el nombre del elemento raíz de la clase sea exactamente como el de mayúsculas y minúsculas XML .
fuente
Nada funcionó para mí por estos errores, EXCEPTO
Excepto de esta manera
1- Debe inspeccionar la respuesta xml como una cadena (la respuesta que está tratando de deserializar en un objeto)
2- Use herramientas en línea para no escapar cadenas y prettify / formateador xml
3- ASEGÚRESE de que la Clase C # (clase principal) que está tratando de asignar / deserializar la cadena xml a TIENE UN XmlRootAttribute que coincide con el elemento raíz de la respuesta.
Ejemplo:
Mi respuesta XML tenía el siguiente aspecto:
Y la definición de clase C # + atributos era como:
Tenga en cuenta que la definición de clase no tiene " XmlRootAttribute "
Y cuando trato de des serializar usando un método genérico:
Estaba recibiendo los errores anteriores
Ahora, simplemente agregando el "XmlRootAttribute" que solucionó el problema para siempre y para todas las demás solicitudes / respuestas tuve un problema similar con:
..
fuente