私はServicestack.TextLibraryを学んでいます。これは、いくつかの最高の機能を備えているためです。XMLを以下のようにDTOの1つに逆シリアル化しようとしています。
C#コード: [コンソールアプリケーションに関連するコードはこちら]
class Program
{
static void Main(string[] args)
{
string str = "http://static.cricinfo.com/rss/livescores.xml";
WebClient w = new WebClient();
string xml = w.DownloadString(str);
Response rss = xml.FromXml<Response>();
foreach (var item in rss.rss.Channel.item)
{
Console.WriteLine(item.title);
}
Console.Read();
}
}
str
[プログラムで与えられた]でXMLファイルを調べることができます。デシリアライズ用のDTOを用意しました。それらは以下の通りです:
public class Response
{
public RSS rss { get; set; }
}
public class RSS
{
public string Version { get; set; }
public ChannelClass Channel { get; set; }
}
public class ChannelClass
{
public string title { get; set; }
public string ttl { get; set; }
public string description { get; set; }
public string link { get; set; }
public string copyright { get; set; }
public string language { get; set; }
public string pubDate { get; set; }
public List<ItemClass> item { get; set; }
}
public class ItemClass
{
public string title { get; set; }
public string link { get; set; }
public string description { get; set; }
public string guid { get; set; }
}
プログラムを実行すると、次のような例外が発生します。
したがって、とを変更するためElement
にnamespace
、次の回避策を実行しました。
私は以下のようDataContractAttribute
に私のクラスに入れました:Response
[DataContract(Namespace = "")]
public class Response
{
public RSS rss { get; set; }
}
Element
デシリアライズ直前に次の2行を追加して名前を以下のように変更しました
//To change rss Element to Response as in Exception
xml = xml.Replace("<rss version=\"2.0\">","<Response>");
//For closing tag
xml = xml.Replace("</rss>","</Response>");
rss
ただし、逆シリアル化されたオブジェクトはであったため、foreachループで別の例外が発生しましたnull
。では、どのように使用して適切な方法で逆シリアル化する必要がありServicestack.Text
ますか?
ノート :
他のライブラリで逆シリアル化する方法をよく知っています。ServiceStackでのみ逆シリアル化したいと思います。