阅读命名空间时ReadAsDataContract异常
问题描述:
我试图使用此link中提到的WCF REST入门工具包来使用此link中提到的Twitter的REST API。阅读命名空间时ReadAsDataContract异常
我在DataContract中使用了与文章 - statusList和status中提到的相同的对象。
[assembly: ContractNamespace("", ClrNamespace = "TwitterShell")]
[CollectionDataContract(Name = "statuses", ItemName = "status")]
public class statusList : List<status> { }
public class user
{
public string id;
public string name;
public string screen_name;
}
public class status
{
public string id;
public string text;
public user user;
}
我正在使用ReadAsDataContract()方法读取XML内容。
HttpClient http = new HttpClient("http://twitter.com/statuses/");
http.TransportSettings.Credentials =
new NetworkCredential("{username}", "{password}");
HttpResponseMessage resp = http.Get("friends_timeline.xml");
resp.EnsureStatusIsSuccessful();
statusList sList = resp.Content.ReadAsDataContract<statusList>();
我得到以下例外。我还没有定义下面的命名空间。
第1行位置出错24.期望从名称空间'http://schemas.datacontract.org/2004/07/sitename'的元素'状态'..遇到名为'状态',名称空间''的'元素'。
请帮忙。谢谢。
答
只是不这样做。如果您尝试使用Datacontracts和操作合同来访问非wcf服务,那么您将处于一个痛苦的世界。
好了,我想这是一个有点不公平离开你高,干燥,而不替代,那么试试这个:
var response = client.Get("http://twitter.com/statuses/friends_timeline.xml");
var statuses = response.Content.ReadAsXElement();
var statusQuery = from st in statuses.Elements("status")
select new status {
id = st.Element("id").Value,
text = st.Element("text").Value,
user = (from us in st.Elements("user")
select new user {
id = us.Element("id").Value,
name = us.Element("name").Value,
screen_name = us.Element("screen_name").Value
}).FirstOrDefault()
};
var statuses = statusQuery.ToList();
使用LINQ to XML来创建XML文档对象可以让你避免串行器的魔力,并完全控制客户端对象的名称和数据类型。这将是非常容易将保鲜膜这是一个新的HttpContent扩展方法,这样你可以简单地做:
var statuses = response.Content.ReadAsTwitterStatuses();
答
我碰到你的帖子寻找答案,以同样的问题,我能找到一个解决方案是什么您正在寻找是否要放弃LINQ to XML方法。
1)确保您有以下装饰
[DataContract (Namespace = "")]
注解你的状态类通过指定上述注解,你会覆盖类的默认命名空间的命名空间。这应该解决你的命名空间问题。
2)为了解决空值问题(我也经历过),您的字段顺序非常重要。当你的对象被反序列化时,它是按字母顺序完成的。您可以使用DataMember注释中的Order属性来命令字段匹配传入XML的顺序。
例如
[DataMember (Order = 1)]
public string text
等等
感谢达雷尔,这个工程。 :-) – hIpPy 2010-02-02 16:20:02