it-swarm-id.com

{"<user xmlns = ''> tidak diharapkan.} Deserializing Twitter XML

Jadi saya menarik XML dari Twitter melalui OAuth

Jadi saya 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>&#187; @alexmuller your kidding? it should all be &quot;black tie&quot; dress code</text>
    <source>&lt;a href=&quot;http://code.google.com/p/wittytwitter/&quot; rel=&quot;nofollow&quot;&gt;Witty&lt;/a&gt;</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 Deserialise

    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 Kelas Pengguna 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 deserialising Xml di atas saya mendapatkan Kesalahan berikut dilemparkan

  • $ 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 apa dan mengapa kesalahan itu terjadi? Serta solusi yang mungkin?

Terima kasih sebelumnya

161
lloydsparkes

Hiasi entitas root Anda dengan atribut XmlRoot yang akan digunakan pada waktu kompilasi.

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

Atau tentukan atribut root saat membuat serial saat runtime.

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

XmlSerializer xs = new XmlSerializer(typeof(User),xRoot);
207
david valentine

Lebih mudah lagi dengan menambahkan anotasi berikut ke bagian atas kelas Anda:

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

Pesan kesalahannya sangat samar, bagi saya saya memiliki kode ini:

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

Pemberitahuan xmlSerializer dipakai dengan Respons aRes tetapi pada deserialisasi saya sengaja melemparkannya ke bResonse.

9
Jeremy Thompson

Solusi paling sederhana dan terbaik adalah dengan menggunakan XMLRoot atribut di kelas Anda, di mana Anda ingin deserialize. 

Seperti:

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

Juga, gunakan Majelis berikut :

using System.Xml.Serialization;
4
Khawaja Asim

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.

4
Luuk

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:

<?xml version="1.0"?>
<personList>
 <Person>
  <FirstName>AAAA</FirstName>
  <LastName>BBB</LastName>
 </Person>
 <Person>
  <FirstName>CCC</FirstName>
  <LastName>DDD</LastName>
 </Person>
</personList>

Kelas C #:

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

De-Serialisasi kode C # dari metode Utama:

XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "personList";
xRoot.IsNullable = true;
using (StreamReader reader = new StreamReader(xmlFilePath))
{
List<Person> result = (List<Person>)(new XmlSerializer(typeof(List<Person>), xRoot)).Deserialize(reader);
 int numOfPersons = result.Count;
}  
2
user2596085

Masalah saya adalah salah satu elemen saya memiliki atribut xmlns:

<?xml version="1.0" encoding="utf-8"?>
<RETS ReplyCode="0">
    <RETS-RESPONSE xmlns="blahblah">
        ...
    </RETS-RESPONSE>
</RETS>

Tidak peduli apa yang saya coba atribut xmlns tampaknya melanggar serializer, jadi saya menghapus jejak xmlns = "..." dari file xml:

<?xml version="1.0" encoding="utf-8"?>
<RETS ReplyCode="0">
    <RETS-RESPONSE>
        ...
    </RETS-RESPONSE>
</RETS>

dan voila! Semuanya berhasil.

Saya sekarang mem-parsing file xml untuk menghapus atribut ini sebelum deserializing . Tidak yakin mengapa ini bekerja, mungkin kasus saya berbeda karena elemen yang mengandung atribut xmlns bukan elemen root.

1
Patrick

Masalah saya adalah bahwa elemen root sebenarnya memiliki xmlns = "abc123"

Jadi harus membuat XmlRoot ("elementname", NameSpace = "abc123")

1
Nick

Semua di atas tidak bekerja untuk saya, tetapi ini adalah: Periksa bahwa nama elemen Root kelas adalah persis seperti yang dari XML case sensitive .

0
shdr