Estou puxando o XML do Twitter via OAuth.
Estou fazendo uma solicitação para http://twitter.com/account/verify_credentials.xml , que retorna o seguinte 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>
Estou usando o seguinte código para desserializar:
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);
}
E eu tenho o seguinte para minha User
classe:
[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; }
}
Mas quando está desserializando o XML acima, o aplicativo lança o seguinte:
$ exception {"Há um erro no documento XML (2, 2)."} System.Exception {System.InvalidOperationException}
InnerException {"<user xmlns = ''> não era esperado."} System.Exception {System.InvalidOperationException}
Agora, pesquisei e a melhor solução que posso encontrar é adicionar espaços de nomes em branco ao serializador quando você serializa o conteúdo, mas não o serializo, portanto não posso.
Eu também tenho algum código para receber status, o que funciona bem.
Então, alguém pode me explicar por que o erro está acontecendo? Bem como uma solução possível?
Desde já, obrigado.
fonte
XmlSerializer
. Então verifique isso também.Respostas:
Decore sua entidade raiz com o atributo XmlRoot, que será usado no momento da compilação.
Ou especifique o atributo raiz ao serializar em tempo de execução.
fonte
Ainda mais fácil é adicionar as seguintes anotações ao topo da sua turma:
fonte
fonte
A mensagem de erro é tão vaga, para mim eu tinha esse código:
Observe que o xmlSerializer é instanciado com aResponse, mas ao desserializar, acidentalmente o projetei para bResonse.
fonte
XmlRoot(..)
na classe filho da classeClassB
paiClassA
. Eu usei emnew XmlSerializer(typeof(ClassA)
vez de onClassB
e também projetei objeto para ele. Obrigado por apontar!A solução mais simples e melhor é usar o atributo XMLRoot em sua classe, na qual você deseja desserializar.
Gostar:
Além disso, use o seguinte assembly :
fonte
XmlRoot()
atributo é necessário para corrigir esse problema? Existem 5 respostas aqui que dizem "basta adicionar este código" e nenhuma explicação. As pessoas estão respondendo 7 anos depois e ainda é apenas "Adicione este código XmlRoot". De todas as respostas, escolhi a mais nova para pedir uma explicação.Como diz John Saunders, verifique se os nomes de classe / propriedade correspondem à letra maiúscula do seu XML. Se não for esse o caso, o problema também ocorrerá.
fonte
Meu problema foi que um dos meus elementos tinha o atributo xmlns:
Não importa o que eu tentei, o atributo xmlns parecia estar quebrando o serializador, por isso removi qualquer vestígio de xmlns = "..." do arquivo xml:
e pronto! Tudo funcionou.
Agora analiso o arquivo xml para remover esse atributo antes de desserializar. Não sei por que isso funciona, talvez meu caso seja diferente, pois o elemento que contém o atributo xmlns não é o elemento raiz.
fonte
A única coisa que funcionou no meu caso foi usar o código david valentine. Usando atributo raiz. na classe Person não ajudou.
Eu tenho esse XML simples:
Classe c #:
Des-serialização do código C # de um método Main:
fonte
No meu caso, meu xml tinha vários namespaces e atributos. Então, eu usei este site para gerar os objetos - https://xmltocsharp.azurewebsites.net/
E usou o código abaixo para desserializar
fonte
Meu problema foi que o elemento raiz realmente possui um xmlns = "abc123"
Então tive que criar XmlRoot ("elementname", NameSpace = "abc123")
fonte
Tudo acima não funcionou para mim, mas foi o seguinte: Verifique se o nome do elemento Raiz da classe é exatamente igual ao do XML que diferencia maiúsculas de minúsculas .
fonte
Nada funcionou para mim por esses erros, EXCETO
Exceto desta maneira
1- Você precisa inspecionar a resposta xml como string (a resposta que você está tentando desserializar para um objeto)
2- Use ferramentas on-line para desescapamento de string e prettify / formatador de xml
3- VERIFIQUE se a classe C # (classe principal) que você está tentando mapear / desserializar a sequência xml para TEM UM XmlRootAttribute que corresponde ao elemento raiz da resposta.
Exemplo:
Minha resposta XML estava olhando como:
E a definição de classe C # + atributos era como:
Observe que a definição de classe não possui " XmlRootAttribute "
E quando tento serializar usando um método genérico:
Eu estava recebendo os erros acima
Agora, apenas adicionando o "XmlRootAttribute" que corrigia o problema para sempre e para todos os outros pedidos / respostas, tive um problema semelhante com:
..
fonte