代码之家  ›  专栏  ›  技术社区  ›  hIpPy

读取命名空间时出现ReadAsDataContract异常

  •  2
  • hIpPy  · 技术社区  · 16 年前

    我正在尝试使用twitter上提到的RESTAPI link 使用本节提到的WCF REST初学者工具包 link .

    我在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处出错。应为命名空间中的元素“status” http://schemas.datacontract.org/2004/07/sitename

    请帮忙。谢谢

    2 回复  |  直到 16 年前
        1
  •  3
  •   Darrel Miller    16 年前

    不要这样做。如果您尝试使用Datacontracts和operation contracts来访问非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();
    
        2
  •  0
  •   Surinder Singh    15 年前

    1) 请确保使用以下装饰注释Status类

    [DataContract (Namespace = "")]
    

    通过指定上述注释,您将从类的默认名称空间重写名称空间。这将解决您的命名空间问题。

    2) 为了解决空值问题(我也经历过),字段的顺序非常重要。当对象被反序列化时,它是按字母顺序进行的。您可以使用DataMember注释上的order属性对字段进行排序,以匹配传入XML的顺序。

    [DataMember (Order = 1)]
    public string text
    

    推荐文章