it-swarm-tr.com

{"<user xmlns = ''> beklenmiyor.} Twitter XML'in seri hale getirilmesi

Öyleyse XML'i Twitter'dan OAuth aracılığıyla çekiyorum

Bu yüzden http://Twitter.com/account/verify_credentials.xml için bir istek yapıyorum

Aşağıdaki XML'yi döndüren 

<?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>

Aşağıdaki kodu Deserialise için kullanıyorum

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

Ve benim kullanıcı sınıfım için aşağıdaki var 

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

}

Ama yukarıdaki Xml seriyi kaldırırken aşağıdaki hata atılmış olsun

  • $ exception {"XML belgesinde bir hata var (2, 2)."} System.Exception {System.InvalidOperationException}

  • InnerException {"<user xmlns = ''> beklenmiyordu."} System.Exception {System.InvalidOperationException}

Şimdi etrafta arama yaptım ve bulabildiğim en iyi çözüm, içeriği serileştirirken serileştiriciye boş ad alanları eklemektir, ancak bunu dizileyemiyorum.

Ayrıca, Durumları almak için iyi çalışan bir kodum var.

Peki biri bana ne olduğunu ve hatanın neden olduğunu açıklayabilir mi? Olası bir çözüm olarak?

Şimdiden teşekkürler

161
lloydsparkes

Kök varlığınızı, derleme zamanında kullanılacak olan XmlRoot özniteliğiyle süsleyin.

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

Veya çalışma zamanında seri hale getirilirken kök niteliğini belirtin.

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

Daha da kolay, sadece sınıfınızın üstüne aşağıdaki ek açıklamaları eklemektir:

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

Hata mesajı çok belirsiz, benim için bu kodu vardı:

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

Dikkat xmlSerializer a Response ile başlatıldı, ancak seriyi silme işleminde yanlışlıkla bResonse'a yönlendirdim.

9
Jeremy Thompson

En basit ve en iyi çözüm, sadece seriyi kaldırmak istediğiniz sınıfınızda XMLRoot özelliğini kullanmaktır. 

Sevmek:

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

Ayrıca, aşağıdaki Assembly öğesini kullanın:

using System.Xml.Serialization;
4
Khawaja Asim

John Saunders'ın dediği gibi, sınıf/özellik adlarının XML'inizin baş harfleri ile aynı olup olmadığını kontrol edin. Durum böyle değilse sorun da ortaya çıkar.

4
Luuk

Benim durumumda çalışan tek şey david valentine kodunu kullanmaktı. Kök Attr. Person sınıfında yardımcı olmadı.

Ben bu basit Xml var:

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

C # sınıfı:

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

Seri hale getirme C # kodu bir ana yöntemden:

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

Sorunum, öğelerimden biri olan xmlns özelliğine sahipti:

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

Ne denedim olursa olsun, xmlns niteliği seri hale getiriciyi kırıyor gibiydi, bu yüzden xmlns = "..." izini xml dosyasından kaldırdım:

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

ve işte! Her şey çalıştı.

Seriyi kaldırmadan önce bu özniteliği kaldırmak için şimdi xml dosyasını ayrıştırıyorum .. __Bunun neden çalıştığından emin değilim, belki benim durumum farklıdır çünkü xmlns özniteliğini içeren öğe root öğesi değildir.

1
Patrick

Benim sorunum, kök elemanın aslında bir xmlns = "abc123" olmasıydı.

Bu yüzden XmlRoot ("elementname", NameSpace = "abc123") yapmak zorunda kaldı

1
Nick

Benim durumumda, xml dosyamın birden fazla isim alanı ve niteliği vardı. Bu yüzden nesneleri üretmek için bu siteyi kullandım - https://xmltocsharp.azurewebsites.net/

Ve seriyi kaldırmak için aşağıdaki kodu kullandık

 XmlDocument doc =  new XmlDocument();
        doc.Load("PathTo.xml");
        User obj;
        using (TextReader textReader = new StringReader(doc.OuterXml))
        {
            using (XmlTextReader reader = new XmlTextReader(textReader))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(User));
                obj = (User)serializer.Deserialize(reader);
            }
        }
0
JoR

Her şey benim için işe yaramadı, ama bu şuydu: Sınıfın Root elemanının adının tam olarak, XML büyük/küçük harfe duyarlı olduğundan emin olun.

0
shdr