{"<utilisateur xmlns="> n'était pas prévu.} La désérialisation XML Twitter
Je suis en tirant dans le fichier XML à partir de Twitter via OAuth.
Je suis en train de faire une demande de http://twitter.com/account/verify_credentials.xml, qui renvoie le code 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 le texte suivant pour mon 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 est au-dessus de la désérialisation du XML de la demande jette le suivant:
-
$exception {"Il y a une erreur dans le document XML (2, 2)."} Système.Exception {Système.InvalidOperationException}
-
InnerException {"<utilisateur xmlns="> n'était pas prévu."} Système.Exception {Système.InvalidOperationException}
Maintenant, j'ai cherché partout et la meilleure solution je trouve, c'est pour ajouter de la vierge des espaces de noms pour le sérialiseur lorsque vous sérialiser le contenu, mais je ne suis pas sérialisation donc je ne peux pas.
J'ai aussi un peu de code pour la réception des Statuts, ce qui fonctionne très bien.
Si quelqu'un peut m'expliquer pourquoi le message d'erreur qui se passe? Ainsi comme une solution possible?
Merci d'avance.
- Dans mon cas, c'était à cause de fausse déclaration de
XmlSerializer
. Vérifiez donc que aussi.
Vous devez vous connecter pour publier un commentaire.
Soit décorer la racine de votre entité avec le XmlRoot attribut qui sera utilisé au moment de la compilation.
Ou spécifier la racine de l'attribut lors de la sérialisation au moment de l'exécution.
Encore plus facile, c'est juste pour ajouter les annotations suivantes en haut de votre classe:
Le message d'erreur est tellement vague, pour moi j'ai eu ce code:
Avis xmlSerializer est instancié avec aResponse mais sur la désérialisation j'ai coulé accidentellement à bResonse.
XmlRoot(..)
sur les enfants de la classeClassB
de la classe parentClassA
. J'ai utilisénew XmlSerializer(typeof(ClassA)
au lieu deClassB
et aussi joué objet. Merci de remarquer!Comme John Saunders dit, vérifier si la classe/les noms de propriété correspond à la capitale boîte de votre XML. Si ce n'est pas le cas, le problème peut également se produire.
La plus simple et la meilleure solution est tout simplement d'utiliser XMLRoot attribut dans la classe, dans laquelle vous souhaitez désérialiser.
Comme:
Aussi, utilisez la commande suivante Assemblée :
XmlRoot()
attribut nécessaire pour résoudre ce problème? Il y a 5 réponses ici que de dire, "il suffit d'ajouter ce code", et non pas une explication. Les gens répondent à 7 ans plus tard et c'est toujours juste, "Ajouter ce XmlRoot code". De toutes les réponses que j'ai pris le plus récent pour demander une explication.Mon problème était l'un de mes éléments ont l'attribut xmlns:
Peu importe ce que j'ai essayé de l'attribut xmlns semblait être de casser le sérialiseur, j'ai donc enlevé toute trace de xmlns="..." dans le fichier xml:
et le tour est joué! Tout a fonctionné.
Je vais maintenant analyser le fichier xml pour supprimer cet attribut avant de la désérialisation.
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 seule chose qui a fonctionné dans mon cas était par l'aide de david valentine code. À L'Aide De La Racine Attr. dans la classe de Personne n'ont pas d'aide.
J'ai cette simple Xml:
De classe C#:
De-la Sérialisation de code C# à partir d'une méthode Principale:
Mon problème a été que l'élément racine a fait un xmlns="abc123"
Donc dû faire XmlRoot("elementname",NameSpace="abc123")
Tous les ci-dessus n'a pas travaillé pour moi, mais c'était:
Vérifiez que le nom de l'élément Racine de la classe est exactement comme celle de XML sensible à la casse.
Dans mon cas, mon xml a plusieurs espaces de noms et des attributs.
J'ai donc utilisé ce site pour générer des objets - https://xmltocsharp.azurewebsites.net/
Et utilisé le code ci-dessous pour désérialiser