Saya menarik XML dari Twitter melalui OAuth.
Saya sedang melakukan permintaan ke http://twitter.com/account/verify_credentials.xml , yang mengembalikan XML berikut:
<?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>
Saya menggunakan kode berikut untuk Deserialize:
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);
}
Dan saya memiliki yang berikut untuk User
kelas saya :
[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; }
}
Tetapi ketika deserializing XML di atas aplikasi melempar hal berikut:
$ exception {"Ada kesalahan dalam dokumen XML (2, 2)."} System.Exception {System.InvalidOperationException}
InnerException {"<user xmlns = ''> tidak diharapkan."} System.Exception {System.InvalidOperationException}
Sekarang saya telah mencari-cari dan solusi terbaik yang dapat saya temukan adalah menambahkan ruang nama kosong ke serializer ketika Anda membuat serial konten, tapi saya tidak membuat serialisasi jadi saya tidak bisa.
Saya juga punya beberapa kode untuk menerima Status, yang berfungsi dengan baik.
Jadi bisakah seseorang menjelaskan kepada saya mengapa kesalahan itu terjadi? Serta solusi yang mungkin?
Terima kasih sebelumnya.
sumber
XmlSerializer
. Jadi periksa juga.Jawaban:
Hiasi entitas root Anda dengan atribut XmlRoot yang akan digunakan pada waktu kompilasi.
Atau tentukan atribut root saat membuat serial saat runtime.
sumber
Lebih mudah lagi dengan menambahkan anotasi berikut ke bagian atas kelas Anda:
sumber
sumber
Pesan kesalahannya sangat samar, bagi saya saya memiliki kode ini:
Perhatikan xmlSerializer dipakai dengan Respons aRes tetapi pada deserialisasi saya sengaja melemparkannya ke bResonse.
sumber
XmlRoot(..)
pada kelas anakClassB
dari kelas indukClassA
. Saya menggunakannew XmlSerializer(typeof(ClassA)
bukan padaClassB
dan juga melemparkan benda ke sana. Terima kasih telah menunjukkan!Solusi paling sederhana dan terbaik adalah dengan menggunakan atribut XMLRoot di kelas Anda, di mana Anda ingin deserialize.
Suka:
Juga, gunakan Majelis berikut :
sumber
XmlRoot()
atribut yang diperlukan untuk memperbaiki masalah ini? Ada 5 jawaban di sini yang mengatakan, "cukup tambahkan kode ini" dan tidak satu penjelasan. Orang-orang menjawab 7 tahun kemudian dan itu tetap saja, "Tambahkan kode XmlRoot ini". Dari semua jawaban saya memilih yang terbaru untuk meminta penjelasan.Seperti yang dikatakan John Saunders, periksa apakah nama kelas / properti cocok dengan huruf kapital dari XML Anda. Jika ini bukan masalahnya, masalahnya juga akan terjadi.
sumber
Masalah saya adalah salah satu elemen saya memiliki atribut xmlns:
Apa pun yang saya coba atribut xmlns tampaknya melanggar serializer, jadi saya menghapus jejak xmlns = "..." dari file xml:
dan voila! Semuanya berhasil.
Saya sekarang mem-parsing file xml untuk menghapus atribut ini sebelum deserializing. Tidak yakin mengapa ini berhasil, mungkin kasus saya berbeda karena elemen yang berisi atribut xmlns bukan elemen root.
sumber
Satu-satunya hal yang berhasil dalam kasus saya adalah dengan menggunakan kode valentine david. Menggunakan Root Attr. di kelas Person tidak membantu.
Saya punya Xml sederhana ini:
Kelas C #:
De-Serialisasi kode C # dari metode Utama:
sumber
Dalam kasus saya, xml saya memiliki beberapa ruang nama dan atribut. Jadi saya menggunakan situs ini untuk menghasilkan objek - https://xmltocsharp.azurewebsites.net/
Dan menggunakan kode di bawah ini untuk deserialize
sumber
Masalah saya adalah bahwa elemen root sebenarnya memiliki xmlns = "abc123"
Jadi harus membuat XmlRoot ("elementname", NameSpace = "abc123")
sumber
Semua di atas tidak bekerja untuk saya, tetapi ini adalah: Periksa bahwa nama elemen Root kelas persis seperti yang dari XML case sensitive .
sumber
Tidak ada yang berfungsi untuk saya untuk kesalahan ini KECUALI
Kecuali dengan cara ini
1- Anda perlu memeriksa respons xml sebagai string (respons yang Anda coba untuk der-serialkan ke objek)
2- Gunakan alat online untuk string unescape dan xml prettify / formatter
3- PASTIKAN bahwa C # Class (kelas utama) yang Anda coba petakan / deserialize string xml untuk MEMILIKI XmlRootAttribute yang cocok dengan elemen root dari respons.
Exmaple:
Respons XML saya menatap seperti:
Dan atribut definisi # kelas C adalah:
Perhatikan bahwa definisi kelas tidak memiliki " XmlRootAttribute "
Dan ketika saya mencoba untuk membuat cerita bersambung menggunakan metode generik:
Saya mendapatkan kesalahan di atas
Sekarang dengan hanya menambahkan "XmlRootAttribute" yang memperbaiki masalah selama-lamanya dan untuk setiap permintaan / tanggapan lainnya saya memiliki masalah serupa dengan:
..
sumber