Wciągam XML z Twittera przez OAuth.
Przesyłam żądanie do http://twitter.com/account/verify_credentials.xml , które zwraca następujący kod XML:
<?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>
Korzystam z następującego kodu do deserializacji:
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);
}
I mam następujące dla mojej User
klasy:
[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; }
}
Ale gdy deserializuje powyższy kod XML, aplikacja rzuca:
$ wyjątek {„Wystąpił błąd w dokumencie XML (2, 2)."} System.Exception {System.InvalidOperationException}
InnerException {"<user xmlns = ''> nie był oczekiwany."} System.Exception {System.InvalidOperationException}
Teraz szukałem i najlepszym rozwiązaniem, jakie mogę znaleźć, jest dodanie pustych przestrzeni nazw do serializatora podczas serializacji treści, ale nie serializuję tego, więc nie mogę.
Mam również kod do odbierania statusów, co działa dobrze.
Czy ktoś może mi wyjaśnić, dlaczego występuje błąd? Jak również możliwe rozwiązanie?
Z góry dziękuję.
źródło
XmlSerializer
. Sprawdź to także.Odpowiedzi:
Albo udekoruj swoją jednostkę główną atrybutem XmlRoot, który będzie używany podczas kompilacji.
Lub określ atrybut root podczas serializacji w czasie wykonywania.
źródło
Jeszcze łatwiej jest po prostu dodać następujące adnotacje na szczycie klasy:
źródło
źródło
Komunikat o błędzie jest tak niejasny, że dla mnie miałem ten kod:
Zauważ, że xmlSerializer jest tworzony przy pomocy aResponse, ale po deserializacji przypadkowo rzuciłem go na bResonse.
źródło
XmlRoot(..)
w klasie dziecięcej klasyClassB
rodzicielskiejClassA
. Użyłemnew XmlSerializer(typeof(ClassA)
zamiast niegoClassB
i rzuciłem na niego przedmiot. Dzięki za wskazanie!Najprostszym i najlepszym rozwiązaniem jest użycie atrybutu XMLRoot w swojej klasie, w którym chcesz dokonać deserializacji.
Lubić:
Użyj także następującego zestawu :
źródło
XmlRoot()
atrybut jest potrzebny do rozwiązania tego problemu? Jest tutaj 5 odpowiedzi, które mówią „po prostu dodaj ten kod”, a nie jedno wyjaśnienie. Ludzie odpowiadają 7 lat później i nadal jest to tylko „Dodaj ten kod XmlRoot”. Ze wszystkich odpowiedzi wybrałem najnowszą z prośbą o wyjaśnienie.Jak mówi John Saunders, sprawdź, czy nazwy klas / właściwości pasują do wielkiej obudowy XML. Jeśli tak nie jest, problem również wystąpi.
źródło
Mój problem polegał na tym, że jeden z moich elementów miał atrybut xmlns:
Bez względu na to, co próbowałem, atrybut xmlns wydawał się zrywać z serializatorem, więc usunąłem wszelkie ślady xmlns = "..." z pliku xml:
i voila! Wszystko działało
Teraz analizuję plik xml, aby usunąć ten atrybut przed deserializacją. Nie jestem pewien, dlaczego to działa, może moja sprawa jest inna, ponieważ element zawierający atrybut xmlns nie jest elementem głównym.
źródło
Jedyną rzeczą, która działała w moim przypadku, było użycie Davida Valentine Code. Korzystanie z Root Attr. w klasie Osoba nie pomogło.
Mam ten prosty plik XML:
Klasa C #:
Kod C # deserializacji z głównej metody:
źródło
W moim przypadku mój xml miał wiele przestrzeni nazw i atrybutów. Więc użyłem tej strony do wygenerowania obiektów - https://xmltocsharp.azurewebsites.net/
I użyłem poniższego kodu do deserializacji
źródło
Mój problem polegał na tym, że element główny faktycznie ma xmlns = "abc123"
Więc musiałem zrobić XmlRoot („nazwa elementu”, NameSpace = „abc123”)
źródło
Wszystkie powyższe nie działały dla mnie, ale było to: Sprawdź, czy nazwa elementu root klasy jest dokładnie taka sama jak nazwa z rozróżnianiem wielkości liter w XML .
źródło
Nic nie działało dla mnie z tymi błędami Z WYJĄTKIEM
Z wyjątkiem tej drogi
1- Musisz sprawdzić odpowiedź xml jako ciąg znaków (odpowiedź, którą próbujesz zdistrializować do obiektu)
2- Użyj narzędzi online do unescape ciągów i prettify / formatter xml
3 - UPEWNIJ SIĘ, że klasa C # (klasa główna), którą próbujesz zmapować / deserializować ciąg xml, ma HAS AN XmlRootAttribute pasujący do elementu głównego odpowiedzi.
Przykład:
Moja odpowiedź XML wyglądała tak:
Definicja + atrybuty klasy C # wyglądały następująco:
Zauważ, że definicja klasy nie ma „ XmlRootAttribute ”
A kiedy próbuję dokonać serializacji przy użyciu ogólnej metody:
Otrzymałem powyższe błędy
Teraz, po prostu dodając „XmlRootAttribute”, który naprawił problem na zawsze, i dla wszystkich innych żądań / odpowiedzi miałem podobny problem z:
..
źródło