对象引用未设置为使用linq to xml的对象实例

本文关键字:xml to 对象 实例 linq 设置 对象引用 | 更新日期: 2023-09-27 17:49:58

        <?xml version="1.0" encoding="utf-8"?>
         <root>
           <Message type="sms">
           <Details locale="en" message-type="User.ResetPassword" />
           <Context>
           <Parameter name="Time" value=" 16:03:31" />
           <Parameter name="pswr" value="00" />
           <Parameter name="Date" value="18/12/2014" />
          </Context>
         <Receiver>+923328749199</Receiver>
        </Message>

我的代码是

     XElement xelement = XElement.Load("C:''Users''qadeer.hussain''Desktop''gw-msg-2.xml");
    var name = from nm in xelement.Elements("Message")
               where (string)nm.Element("Receiver") == "+923328749199"
               select nm;
    foreach (XElement xEle in name)
        Console.WriteLine(xEle.value);

我不知道为什么我得到这个错误,你能帮我解决这个问题吗

对象引用未设置为使用linq to xml的对象实例

这是一个使用Xlement来解析所提供的xml的解决方案,注意在方法GetMessageFromXml中,检查null,使用FirstOrDefault和使用Attributes ' Elements '来分离或遍历xml。

var xml = XElement.Parse(GetXmlToProcess());
var messages = xml.Elements("Message").Select(x=> 
                      {
                          return GetMessageFromXml(x);
                      });
//method to parse
public Message GetMessageFromXml( XElement elem)
{
        var msg  = new Message();
        var type = elem.Attributes("type").FirstOrDefault();
        msg.Type =type != null? type.Value : null;
        var detail =elem.Elements("Details");
        if (detail != null)
        {
            var locale = detail.Attributes("locale").FirstOrDefault();
            var messageType = detail.Attributes("message-type").FirstOrDefault();
            msg.Details = new Detail()
                            {
                                Locale=locale != null? locale.Value: null,
                                MessageType= messageType != null? messageType.Value: null
                            };
        }
        var reciever =elem.Elements("Receiver").FirstOrDefault();
        if (reciever != null)
        {
            msg.Receiver = reciever.Value;
        }
        var context = elem.Elements("Context");
        if (context != null)
        {
            msg.Context = new Context();
            msg.Context.Parameters.AddRange(context.Elements("Parameter").Select(x=>
            {
                var parameter = new Parameter();
                var name = x.Attributes("name").FirstOrDefault();
                var value = x.Attributes("value").FirstOrDefault();
                parameter.Name = name!= null? name.Value:null;
                parameter.Value = value!=null? value.Value:null;
                return parameter;
            }).ToList());
        }
        return msg;
}

使用的类

public class Message
{
    public string Type{get; set;}
    public Detail Details {get; set;}
    public Context Context {get; set;}
    public string Receiver{get;set;}
}
public class Detail
{
    public string Locale{get;set;}
    public string MessageType{get;set;}
}
public class Context
{
    public List<Parameter> Parameters {get;set;}
    public Context()
    {
        Parameters =  new List<Parameter>();
    }
}   
public class Parameter
{   
    public string Name {get;set;}
    public string Value {get;set;}
}