[C#] { “<user xmlns = ”>이 (가) 예상되지 않았습니다.} Twitter XML 역 직렬화
OAuth를 통해 Twitter에서 XML을 가져옵니다.
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을 직렬화 해제하면 응용 프로그램에서 다음을 throw합니다.
-
$ exception { “XML 문서 (2, 2)에 오류가 있습니다.”} System.Exception {System.InvalidOperationException}
-
InnerException { “<user xmlns = ”>이 (가) 예상되지 않았습니다.”} System.Exception {System.InvalidOperationException}
이제 검색 한 결과 가장 좋은 해결책은 내용을 serialize 할 때 serializer에 빈 네임 스페이스를 추가하는 것이지만 직렬화하지 않아서 할 수 없습니다.
상태를 수신하기위한 코드도 있는데, 제대로 작동합니다.
그렇다면 누군가 오류가 발생하는 이유를 설명 할 수 있습니까? 가능한 해결책뿐만 아니라?
미리 감사드립니다.
답변
컴파일시에 사용될 XmlRoot 속성으로 루트 엔티티를 장식하십시오.
[XmlRoot(Namespace = "www.contoso.com", ElementName = "MyGroupName", DataType = "string", IsNullable=true)]
또는 런타임시 직렬화를 해제 할 때 루트 속성을 지정하십시오.
XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "user";
// xRoot.Namespace = "http://www.cpandl.com";
xRoot.IsNullable = true;
XmlSerializer xs = new XmlSerializer(typeof(User),xRoot);
답변
수업 상단에 다음 주석을 추가하는 것이 더 쉽습니다.
[Serializable, XmlRoot("user")]
public partial class User
{
}
답변
XmlSerializer xs = new XmlSerializer(typeof(User), new XmlRootAttribute("yourRootName"));
답변
오류 메시지가 너무 모호합니다.이 코드는 다음과 같습니다.
var streamReader = new StreamReader(response.GetResponseStream());
var xmlSerializer = new XmlSerializer(typeof(aResponse));
theResponse = (bResponse) xmlSerializer.Deserialize(streamReader);
xmlSerializer는 aResponse로 인스턴스화되었지만 역 직렬화 중에 실수로 bResonse에 캐스팅했습니다.
답변
가장 간단하고 최상의 솔루션은 직렬화 해제하려는 클래스에서 XMLRoot 속성 을 사용 하는 것입니다.
처럼:
[XmlRoot(ElementName = "YourPreferableNameHere")]
public class MyClass{
...
}
또한 다음 어셈블리를 사용하십시오 .
using System.Xml.Serialization;
답변
John Saunders가 말했듯이 클래스 / 프로퍼티 이름이 XML의 대문자와 일치하는지 확인하십시오. 그렇지 않은 경우에도 문제가 발생합니다.
답변
내 문제는 내 요소 중 하나에 xmlns 특성이 있다는 것입니다.
<?xml version="1.0" encoding="utf-8"?>
<RETS ReplyCode="0">
<RETS-RESPONSE xmlns="blahblah">
...
</RETS-RESPONSE>
</RETS>
내가 무엇을 시도하든 xmlns 속성이 직렬 변환기를 손상시키는 것처럼 보이므로 xml 파일에서 xmlns = “…”의 흔적을 제거했습니다.
<?xml version="1.0" encoding="utf-8"?>
<RETS ReplyCode="0">
<RETS-RESPONSE>
...
</RETS-RESPONSE>
</RETS>
그리고 짜잔! 모든 것이 효과가있었습니다.
이제 직렬화 해제하기 전에 xml 파일을 구문 분석하여이 속성을 제거하십시오. 왜 이것이 효과가 있는지 잘 모르겠습니다 .xmlns 속성을 포함하는 요소가 루트 요소가 아니기 때문에 제 경우가 다를 수 있습니다.