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を逆シリアル化すると、アプリケーションは次をスローします。
$ exception {"XMLドキュメントにエラーがあります(2、2)。"} System.Exception {System.InvalidOperationException}
InnerException {"<user xmlns = ''>は予期されていませんでした。"} System.Exception {System.InvalidOperationException}
今、私は周りを検索しましたが、コンテンツをシリアル化するときに空の名前空間をシリアライザーに追加するのが最善の解決策です。しかし、シリアル化していないのでできません。
ステータスを受け取るためのコードもいくつかありますが、これは正常に機能します。
だから誰かが私にエラーが起こっている理由を説明できますか?可能な解決策と同様に?
前もって感謝します。
コンパイル時に使用される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{
...
}
また、次のAssemblyを使用します。
using System.Xml.Serialization;
John Saundersが言うように、クラス/プロパティ名がXMLの大文字と一致するかどうかを確認してください。そうでない場合は、問題も発生します。
私の問題は、私の要素の1つに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属性を含む要素はルート要素ではないため、私の場合は異なるかもしれません。
私の場合にうまくいったのは、デビッドバレンタインコードを使用することだけでした。ルート属性の使用。 Personクラスでは役に立ちませんでした。
この単純なXmlがあります。
<?xml version="1.0"?>
<personList>
<Person>
<FirstName>AAAA</FirstName>
<LastName>BBB</LastName>
</Person>
<Person>
<FirstName>CCC</FirstName>
<LastName>DDD</LastName>
</Person>
</personList>
C#クラス:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
Mainメソッドからのシリアル化解除C#コード:
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;
}
私の問題は、ルート要素に実際にxmlns = "abc123"があることです
そのため、XmlRoot( "elementname"、NameSpace = "abc123")を作成する必要がありました
上記はすべてうまくいきませんでしたが、これは次のとおりでした:クラスのルート要素の名前がexactlyであることを確認してください大文字と小文字を区別する。
私の場合、私のxmlには複数の名前空間と属性がありました。このサイトを使用してオブジェクトを生成しました- https://xmltocsharp.azurewebsites.net/
そして、以下のコードを使用してデシリアライズします
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);
}
}