Ich ziehe das XML von Twitter über OAuth ein.
Ich sende eine Anfrage an http://twitter.com/account/verify_credentials.xml , die das folgende XML zurückgibt:
<?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>
Ich verwende den folgenden Code zum Deserialisieren:
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);
}
Und ich habe folgendes für meine User
Klasse:
[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; }
}
Wenn das obige XML deserialisiert wird, löst die Anwendung Folgendes aus:
$ exception {"Im XML-Dokument (2, 2) ist ein Fehler aufgetreten."} System.Exception {System.InvalidOperationException}
InnerException {"<user xmlns = ''> wurde nicht erwartet."} System.Exception {System.InvalidOperationException}
Jetzt habe ich mich umgesehen und die beste Lösung, die ich finden kann, besteht darin, dem Serializer leere Namespaces hinzuzufügen, wenn Sie den Inhalt serialisieren, aber ich serialisiere ihn nicht, also kann ich nicht.
Ich habe auch einen Code zum Empfangen von Status, der gut funktioniert.
Kann mir jemand erklären, warum der Fehler auftritt? Sowie eine mögliche Lösung?
Danke im Voraus.
quelle
XmlSerializer
. Überprüfen Sie das auch.Antworten:
Dekorieren Sie entweder Ihre Stammentität mit dem XmlRoot-Attribut, das zur Kompilierungszeit verwendet wird.
Oder geben Sie das Root-Attribut an, wenn Sie zur Laufzeit de serialisieren.
quelle
Noch einfacher ist es, die folgenden Anmerkungen oben in Ihrer Klasse hinzuzufügen:
quelle
quelle
Die Fehlermeldung ist so vage, für mich hatte ich diesen Code:
Beachten Sie, dass xmlSerializer mit aResponse instanziiert wird, aber beim Deserialisieren habe ich es versehentlich in bResonse umgewandelt.
quelle
XmlRoot(..)
auf KinderklasseClassB
der ElternklasseClassA
. Ich habenew XmlSerializer(typeof(ClassA)
statt auf verwendetClassB
und auch Objekt darauf gegossen. Vielen Dank für den Hinweis!Die einfachste und beste Lösung besteht darin, das XMLRoot- Attribut in Ihrer Klasse zu verwenden, in der Sie deserialisieren möchten.
Mögen:
Verwenden Sie auch die folgende Baugruppe :
quelle
XmlRoot()
Attribut benötigt, um dieses Problem zu beheben? Hier gibt es 5 Antworten mit der Aufschrift "Fügen Sie einfach diesen Code hinzu" und keine einzige Erklärung. Die Leute antworten 7 Jahre später und es ist immer noch nur "Diesen XmlRoot-Code hinzufügen". Von allen Antworten habe ich die neueste ausgewählt, um nach einer Erklärung zu fragen.Überprüfen Sie, wie John Saunders sagt, ob die Klassen- / Eigenschaftsnamen mit dem Großbuchstaben Ihres XML übereinstimmen. Ist dies nicht der Fall, tritt das Problem ebenfalls auf.
quelle
Mein Problem war, dass eines meiner Elemente das Attribut xmlns hatte:
Unabhängig davon, was ich ausprobiert habe, schien das xmlns-Attribut den Serializer zu beschädigen, daher habe ich alle Spuren von xmlns = "..." aus der xml-Datei entfernt:
und voila! Alles hat funktioniert.
Ich analysiere jetzt die XML-Datei, um dieses Attribut vor dem Deserialisieren zu entfernen. Ich bin mir nicht sicher, warum dies funktioniert. Vielleicht ist mein Fall anders, da das Element, das das xmlns-Attribut enthält, nicht das Stammelement ist.
quelle
Das einzige, was in meinem Fall funktionierte, war die Verwendung von David Valentine Code. Verwenden von Root Attr. in der Person Klasse hat nicht geholfen.
Ich habe diese einfache XML:
C # -Klasse:
De-Serialization C # -Code von einer Hauptmethode:
quelle
In meinem Fall hatte meine XML mehrere Namespaces und Attribute. Also habe ich diese Seite benutzt, um die Objekte zu generieren - https://xmltocsharp.azurewebsites.net/
Und den folgenden Code zum Deserialisieren verwendet
quelle
Mein Problem war, dass das Stammelement tatsächlich ein xmlns = "abc123" hat.
Musste also XmlRoot machen ("elementname", NameSpace = "abc123")
quelle
Alles oben hat bei mir nicht funktioniert, aber dies war: Überprüfen Sie, ob der Name des Root-Elements der Klasse genau dem von XML entspricht, wobei zwischen Groß- und Kleinschreibung unterschieden wird .
quelle
Für diese Fehler hat bei mir nichts funktioniert , AUSSER
Außer auf diese Weise
1- Sie müssen die XML-Antwort als Zeichenfolge überprüfen (die Antwort, die Sie versuchen, für ein Objekt zu de-serialisieren).
2- Verwenden Sie Online-Tools für String Unescape und XML Prettify / Formatierer
3- Stellen Sie sicher, dass die C # -Klasse (Hauptklasse), die Sie der XML-Zeichenfolge zuordnen / deserialisieren möchten, ein XmlRootAttribute hat , ein , das dem der Antwort entspricht.
Beispiel:
Meine XML-Antwort sah wie folgt aus:
Und die C + -Klassendefinition + Attribute waren wie folgt:
Beachten Sie, dass die Klassendefinition nicht " XmlRootAttribute " enthält.
Und wenn ich versuche, mit einer generischen Methode zu de serialisieren:
Ich habe die obigen Fehler erhalten
Durch einfaches Hinzufügen des "XmlRootAttribute", das das Problem für immer und für alle anderen Anfragen / Antworten behoben hat, hatte ich ein ähnliches Problem mit:
..
quelle