Я извлекаю XML из Twitter через OAuth.
Я делаю запрос к http://twitter.com/account/verify_credentials.xml , который возвращает следующий 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>
Я использую следующий код для десериализации:
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);
}
И у меня есть следующее для моего User
класса:
[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; }
}
Но при десериализации вышеуказанного XML приложение выдает следующее:
$ exception {"Ошибка в XML-документе (2, 2)."} System.Exception {System.InvalidOperationException}
InnerException {"<user xmlns = ''> не ожидалось."} System.Exception {System.InvalidOperationException}
Теперь я искал вокруг, и лучшее решение, которое я могу найти, это добавить пустые пространства имен в сериализатор, когда вы сериализуете контент, но я не сериализую его, поэтому я не могу.
У меня также есть код для получения статусов, который отлично работает.
Так может кто-нибудь объяснить мне, почему происходит ошибка? Как и возможное решение?
Заранее спасибо.
источник
XmlSerializer
. Так что проверьте это тоже.Ответы:
Либо украсьте вашу корневую сущность атрибутом XmlRoot, который будет использоваться во время компиляции.
Или укажите корневой атрибут при сериализации во время выполнения.
источник
Еще проще просто добавить следующие аннотации в начало вашего класса:
источник
источник
Сообщение об ошибке настолько расплывчато, для меня у меня был такой код:
Обратите внимание, что xmlSerializer создается с помощью aResponse, но при десериализации я случайно привел его к bResonse.
источник
XmlRoot(..)
на дочернем классеClassB
родительского классаClassA
. Я использовалnew XmlSerializer(typeof(ClassA)
вместо onClassB
и также бросил объект к нему. Спасибо за указание!Самое простое и лучшее решение - просто использовать XMLRoot атрибут в вашем классе, который вы хотите десериализовать.
Подобно:
Также используйте следующую сборку :
источник
XmlRoot()
атрибут необходимо , чтобы устранить эту проблему? Здесь есть 5 ответов «просто добавьте этот код», а не одно объяснение. Люди отвечают 7 лет спустя, и все равно это просто «Добавить этот код XmlRoot». Из всех ответов я выбрал самый новый, чтобы попросить объяснения.Как говорит Джон Сондерс, проверьте, соответствуют ли имена классов / свойств заглавным буквам вашего XML. Если это не так, проблема также возникнет.
источник
Моя проблема была в том, что один из моих элементов имел атрибут xmlns:
Независимо от того, что я пробовал, атрибут xmlns, казалось, нарушал сериализатор, поэтому я удалил любой след xmlns = "..." из файла xml:
и вуаля! Все работало
Теперь я анализирую XML-файл, чтобы удалить этот атрибут перед десериализацией. Не уверен, почему это работает, возможно, мой случай другой, так как элемент, содержащий атрибут xmlns, не является корневым элементом.
источник
Единственное, что сработало в моем случае - это использование кода Дэвида Валентина. Использование Root Attr. в классе Person не помогло.
У меня есть этот простой Xml:
C # класс:
Сериализация кода C # из метода Main:
источник
В моем случае у моего xml было несколько пространств имен и атрибутов. Поэтому я использовал этот сайт для генерации объектов - https://xmltocsharp.azurewebsites.net/
И использовал приведенный ниже код для десериализации
источник
Моя проблема заключалась в том, что корневой элемент на самом деле имеет xmlns = "abc123"
Так что пришлось сделать XmlRoot ("elementname", NameSpace = "abc123")
источник
Все вышеперечисленное не сработало для меня, но это было: Проверьте, что имя элемента Root класса точно такое же, как в XML с учетом регистра .
источник
Ничто не помогло мне за эти ошибки, КРОМЕ
Кроме этого пути
1. Вам нужно проверить xml-ответ в виде строки (ответ, который вы пытаетесь десериализовать для объекта)
2- Используйте онлайн-инструменты для строки unescape и XML prettify / formatter
3. УБЕДИТЕСЬ, что класс C # (основной класс), который вы пытаетесь отобразить / десериализовать, для строки xml имеет XmlRootAttribute , соответствующий корневому элементу ответа.
Exmaple:
Мой XML-ответ выглядел так:
И определение + атрибуты класса C # было похоже на:
Обратите внимание, что определение класса не имеет « XmlRootAttribute »
И когда я пытаюсь де сериализовать с использованием универсального метода:
Я получаю ошибки выше
Теперь, просто добавив «XmlRootAttribute», который исправил проблему навсегда и для всех других запросов / ответов, у меня была похожая проблема:
..
источник