{” n’était pas attendu.} Désérialisation de XML XML

Donc, je tire le XML de Twitter via OAuth

Donc, je fais une demande à http://twitter.com/account/verify_credentials.xml

Qui renvoie le XML suivant

  16434938 Lloyd Sparkes lloydsparkes Hockley, Essex, UK Student http://soffr.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    

J’utilise le code suivant pour désérialiser

  public User VerifyCredentials() { ssortingng url = "http://twitter.com/account/verify_credentials.xml"; ssortingng xml = _oauth.oAuthWebRequestAsSsortingng(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 classe d’utilisateurs

  [System.Xml.Serialization.XmlTypeAtsortingbute(AnonymousType = true)] public partial class User { [XmlElement(ElementName = "id")] public long Id { get; set; } [XmlElement(ElementName = "name")] public ssortingng Name { get; set; } [XmlElement(ElementName = "screen_name")] public ssortingng ScreenName { get; set; } [XmlElement(ElementName = "location")] public ssortingng Location { get; set; } [XmlElement(ElementName = "description")] public ssortingng Description { get; set; } [XmlElement(ElementName = "profile_image_url")] public ssortingng ProfileImageUrl { get; set; } [XmlElement(ElementName = "url")] public ssortingng 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 ssortingng ProfileBackgroundColor { get; set; } [XmlElement(ElementName = "profile_text_color")] public ssortingng ProfileTextColor { get; set; } [XmlElement(ElementName = "profile_link_color")] public ssortingng ProfileLinkColor { get; set; } [XmlElement(ElementName = "profile_sidebar_fill_color")] public ssortingng ProfileSidebarFillColor { get; set; } [XmlElement(ElementName = "profile_sidebar_border_color")] public ssortingng ProfileSidebarBorderColor { get; set; } [XmlElement(ElementName = "friends_count")] public int FriendsCount { get; set; } [XmlElement(ElementName = "created_at")] public ssortingng 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 ssortingng Timezone { get; set; } [XmlElement(ElementName = "profile_background_image_url")] public ssortingng 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 ssortingng Notifications { get; set; } [XmlElement(ElementName = "geo_enabled")] public bool GeoEnabled { get; set; } [XmlElement(ElementName = "Verified")] public bool Verified { get; set; } [XmlElement(ElementName = "following")] public ssortingng Following { get; set; } [XmlElement(ElementName = "status", IsNullable=true)] public Status CurrentStatus { get; set; } } 

Mais quand il désérialise le Xml ci-dessus, j’obtiens l’erreur suivante

  • $ exception {“Il y a une erreur dans le document XML (2, 2).”} System.Exception {System.InvalidOperationException}

  • InnerException {” n’était pas attendu.”} System.Exception {System.InvalidOperationException}

Maintenant, j’ai recherché et la meilleure solution que je puisse trouver est d’append des espaces de noms vierges au sérialiseur, lorsque vous sérialisez le contenu, mais que je ne le sérialise pas, donc je ne peux pas.

J’ai aussi du code pour recevoir des statuts, ce qui fonctionne bien.

Alors, est-ce que quelqu’un peut m’expliquer quoi et pourquoi l’erreur se produit? Aussi bien qu’une solution possible?

Merci d’avance

Décorez votre entité racine avec l’atsortingbut XmlRoot qui sera utilisé au moment de la compilation.

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

Ou spécifiez l’atsortingbut racine lors de la désérialisation lors de l’exécution.

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

Encore plus simple, il suffit d’append les annotations suivantes en haut de votre classe:

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

Le message d’erreur est tellement vague, pour moi j’avais ce code:

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

Notez que xmlSerializer est instancié avec aResponse mais en désérialisant, je l’ai lancé accidentellement sur bResonse.

Comme le dit John Saunders, vérifiez si les noms de classe / propriété correspondent à la casse de votre XML. Si ce n’est pas le cas, le problème se produira également.

La solution la plus simple et la meilleure consiste à utiliser l’atsortingbut XMLRoot dans votre classe, dans laquelle vous souhaitez déséraliser.

Comme:

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

Utilisez également la DLL suivante:

 using System.Xml.Serialization; 

Mon problème était qu’un de mes éléments avait l’atsortingbut xmlns:

    ...   

Peu importe ce que j’ai essayé, l’atsortingbut xmlns semblait briser le sérialiseur, alors j’ai supprimé toute trace de xmlns = “…” du fichier xml:

    ...   

et le tour est joué! Tout a fonctionné.

J’parsing maintenant le fichier xml pour supprimer cet atsortingbut 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’atsortingbut xmlns n’est pas l’élément racine.

La seule chose qui a fonctionné dans mon cas était en utilisant le code de valentine de david. Utiliser Root Attr. dans la classe Personne n’a pas aidé.

J’ai ce simple Xml:

    AAAA BBB   CCC DDD   

Classe C #:

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

Sérialisation du code C # d’une méthode principale:

 XmlRootAtsortingbute xRoot = new XmlRootAtsortingbute(); 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; } 

Mon problème était que l’élément racine a en fait un xmlns = “abc123”

Il fallait donc faire XmlRoot (“elementname”, NameSpace = “abc123”)

Mon scénario était que je travaillais sur un travail où le code était dans VB.NET, et une routine qui désérialisait les objects des chaînes xml fonctionnait parfaitement pour des dizaines d’utilisations, mais a échoué hier avec le “user xmlns =” error (quand une chaîne xml y était lancée, c’était la sérialisation d’un object ayant une propriété qui était elle-même un object sérialisé) Les réponses ci-dessus m’ont aidé à résoudre ce problème en prenant cette routine qui fonctionnait …

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

… copiez ce code et créez une nouvelle routine permettant à l’appelant de fournir une chaîne “Nom d’atsortingbut racine”. La nouvelle routine a désérialisé l’object ‘problem’ de sa chaîne xml sérialisée sans erreur:

 ' DESERIALIZE OBJECT FROM XML STRING, SUPPLYING A ROOT ATTRIBUTE ELEMENT NAME Public Shared Function DeserializeFromXmlWithRootAtsortingbute(Of T)(ByVal xml As Ssortingng, ByVal rootAtsortingbuteName As Ssortingng) As T Dim response As T = Nothing Try Using reader As TextReader = New SsortingngReader(xml) Dim xra As New XmlRootAtsortingbute() xra.ElementName = rootAtsortingbuteName 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