{” non era previsto.} Deserializzazione di Twitter XML

Quindi im prendere l’XML da Twitter tramite OAuth

Quindi sto facendo una richiesta a http://twitter.com/account/verify_credentials.xml

Che restituisce il seguente XML

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

Sto usando il seguente codice per deserializzare

  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); } 

E ho il seguente per la mia class utente

  [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; } } 

Ma quando deserializza il suddetto Xml ottengo il seguente errore lanciato

  • $ exception {“C’è un errore nel documento XML (2, 2).”} System.Exception {System.InvalidOperationException}

  • InnerException {” non era previsto.”} System.Exception {System.InvalidOperationException}

Ora ho cercato in giro e la soluzione migliore che riesco a trovare è quella di aggiungere spazi dei nomi vuoti al serializzatore, quando serializzi il contenuto, MA non lo sto serializzando così non posso.

Ho anche un po ‘di codice per ricevere Status, che funziona bene.

Quindi qualcuno può spiegarmi cosa e perché sta succedendo l’errore? Oltre a una ansible soluzione?

Grazie in anticipo

O decora l’ quadro radice con l’attributo XmlRoot che verrà utilizzato in fase di compilazione.

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

Oppure specificare l’attributo root durante la de serializzazione in fase di runtime.

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

Ancora più semplice è solo aggiungere le seguenti annotazioni al top della class:

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

Il messaggio di errore è così vago, per me ho avuto questo codice:

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

Avviso xmlSerializer è istanziato con aResponse ma in deserializzazione l’ho castato accidentalmente a bResonse.

Come dice John Saunders, controlla se i nomi di class / proprietà corrispondono al capital box del tuo XML. Se questo non è il caso, si verificherà anche il problema.

La soluzione più semplice e migliore è usare l’ attributo XMLRoot nella tua class, in cui desideri desertificare.

Piace:

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

Utilizzare anche la seguente DLL :

 using System.Xml.Serialization; 

Il mio problema era che uno dei miei elementi aveva l’attributo xmlns:

    ...   

A prescindere da ciò che ho provato, l’attributo xmlns sembrava interrompere il serializzatore, quindi ho rimosso ogni traccia di xmlns = “…” dal file xml:

    ...   

e voilà! Tutto ha funzionato.

Ora analizzo il file xml per rimuovere questo attributo prima di deserializzare. Non sono sicuro del motivo per cui questo funziona, forse il mio caso è diverso poiché l’elemento contenente l’attributo xmlns non è l’elemento radice.

L’unica cosa che ha funzionato nel mio caso è stata l’utilizzo del codice di david valentine. Usando Root Attr. nella class Person non ha aiutato.

Ho questo semplice Xml:

    AAAA BBB   CCC DDD   

Classe C #:

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

De-Serialization C # codice da un metodo Main:

 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; } 

Il mio problema era che l’elemento root in realtà ha un xmlns = “abc123”

Quindi dovevo creare XmlRoot (“elementname”, NameSpace = “abc123”)

Il mio scenario era che stavo lavorando su un lavoro in cui il codice era in VB.NET, e una routine che deserializzava gli oggetti dalle stringhe xml funzionava benissimo per dozzine di usi, ma non era riuscito ieri con “utente xmlns =” ​​non era previsto errore (quando veniva lanciata una stringa xml che era la serializzazione di un object che aveva una proprietà che era, a sua volta, un object serializzato) .Le risposte di cui sopra mi hanno aiutato a risolvere questo problema prendendo questa routine che aveva funzionato …

 ' 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 

… copia quel codice e crea una nuova routine che permetta al chiamante di fornire una stringa “Nome attributo radice”. La nuova routine ha deserializzato l’object “problema” dalla sua stringa xml serializzata senza errori:

 ' 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