Je récupère le XML de Twitter via OAuth.
Je fais une demande à http://twitter.com/account/verify_credentials.xml , qui retourne le XML suivant:
<?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>
J'utilise le code suivant pour désérialiser:
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);
}
Et j'ai les éléments suivants pour ma User
classe:
[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; }
}
Mais quand il désérialise le XML ci-dessus, l'application lance ce qui suit:
$ exception {"Il y a une erreur dans le document XML (2, 2)."} System.Exception {System.InvalidOperationException}
InnerException {"<user xmlns = ''> n'était pas attendue."} System.Exception {System.InvalidOperationException}
Maintenant, j'ai cherché et la meilleure solution que je peux trouver est d'ajouter des espaces de noms vides au sérialiseur lorsque vous sérialisez le contenu, mais je ne le sérialise pas, donc je ne peux pas.
J'ai également un code pour recevoir des statuts, ce qui fonctionne bien.
Alors, quelqu'un peut-il m'expliquer pourquoi l'erreur se produit? Ainsi qu'une solution possible?
Merci d'avance.
la source
XmlSerializer
. Alors vérifiez cela aussi.Réponses:
Soit décorez votre entité racine avec l'attribut XmlRoot qui sera utilisé au moment de la compilation.
Ou spécifiez l'attribut racine lors de la désérialisation à l'exécution.
la source
Il est encore plus facile d'ajouter simplement les annotations suivantes en haut de votre classe:
la source
la source
Le message d'erreur est tellement vague, pour moi j'avais ce code:
Remarquez que xmlSerializer est instancié avec aResponse mais lors de la désérialisation, je l'ai accidentellement casté en bResonse.
la source
XmlRoot(..)
sur la classe enfantClassB
de la classe parentClassA
. J'ai utilisénew XmlSerializer(typeof(ClassA)
au lieu d'ClassB
activer et également coulé un objet dessus. Merci d'avoir souligné!La solution la plus simple et la meilleure consiste simplement à utiliser l' attribut XMLRoot dans votre classe, dans laquelle vous souhaitez désérialiser.
Comme:
Utilisez également l' assemblage suivant :
la source
XmlRoot()
attribut est-il nécessaire pour résoudre ce problème? Il y a 5 réponses ici qui disent, "ajoutez simplement ce code" et pas une explication. Les gens répondent 7 ans plus tard et c'est toujours juste, "Ajoutez ce code XmlRoot". De toutes les réponses, j'ai choisi la plus récente pour demander une explication.Comme le dit John Saunders, vérifiez si les noms de classe / propriété correspondent à la casse majuscule de votre XML. Si ce n'est pas le cas, le problème se produira également.
la source
Mon problème était qu'un de mes éléments avait l'attribut xmlns:
Peu importe ce que j'ai essayé, l'attribut xmlns semblait rompre le sérialiseur, j'ai donc supprimé toute trace de xmlns = "..." du fichier xml:
et le tour est joué! Tout fonctionnait.
J'analyse maintenant le fichier xml pour supprimer cet attribut avant de désérialiser. Je ne sais pas pourquoi cela fonctionne, peut-être que mon cas est différent puisque l'élément contenant l'attribut xmlns n'est pas l'élément racine.
la source
La seule chose qui a fonctionné dans mon cas a été d'utiliser le code david valentine. Utilisation de Root Attr. dans la classe Personne n'a pas aidé.
J'ai ce simple Xml:
Classe C #:
Code C # de désérialisation d'une méthode principale:
la source
Dans mon cas, mon xml avait plusieurs espaces de noms et attributs. J'ai donc utilisé ce site pour générer les objets - https://xmltocsharp.azurewebsites.net/
Et utilisé le code ci-dessous pour désérialiser
la source
Mon problème était que l'élément racine avait en fait un xmlns = "abc123"
Il a donc fallu faire XmlRoot ("elementname", NameSpace = "abc123")
la source
Tout ce qui précède n'a pas fonctionné pour moi, mais c'était: Vérifiez que le nom de l'élément racine de la classe est exactement comme celui de XML sensible à la casse .
la source
Rien n'a fonctionné pour moi pour ces erreurs SAUF
Sauf de cette façon
1- Vous devez inspecter la réponse xml en tant que chaîne (la réponse que vous essayez de désérialiser en un objet)
2- Utilisez des outils en ligne pour échapper les chaînes et prettify / formatter xml
3- ASSUREZ-VOUS que la classe C # (classe principale) que vous essayez de mapper / désérialiser la chaîne xml a HAS AN XmlRootAttribute qui correspond à l'élément racine de la réponse.
Exmaple:
Ma réponse XML regardait comme:
Et la définition de la classe C # + les attributs étaient comme:
Notez que la définition de classe n'a pas " XmlRootAttribute "
Et quand j'essaye de désérialiser en utilisant une méthode générique:
J'obtenais les erreurs ci-dessus
Maintenant, en ajoutant simplement le "XmlRootAttribute" qui a résolu le problème pour toujours et pour toutes les autres demandes / réponses, j'ai eu un problème similaire avec:
..
la source