C# 将XML解析为对象

C# 将XML解析为对象,c#,xml,linq,C#,Xml,Linq,以下是XML: <?xml version="1.0" encoding="utf-8" ?> <object> <body>tests</body> <send_results type="null" /> <note_class>none</note_class> <users type="list" /> <title>tes

以下是XML:

  <?xml version="1.0" encoding="utf-8" ?> 
  <object>
    <body>tests</body> 
    <send_results type="null" /> 
    <note_class>none</note_class> 
    <users type="list" /> 
    <title>test</title> 
    <time_sent type="null" /> 
    <image type="null" /> 
    <to_customers type="boolean">False</to_customers> 
    <time_created>2013-06-26T16:40:50</time_created> 
    <num_sends type="integer">0</num_sends> 
    <time_scheduled type="null" /> 
    <dealership>/api/v1/dealerships/10/</dealership> 
    <id type="integer">22</id> 
    <send_rate>none</send_rate> 
    <send_method>email</send_method> 
    <reply_to_email>do_not_reply@williamson-cadillac.com</reply_to_email> 
    <response_link type="null" /> 
    <to_users type="boolean">True</to_users> 
    <resource_uri>/api/v1/notifications/22/</resource_uri> 
  </object>
我在变量“query”中不断得到“nothing”或“null”


我想不出来,我试过很多不同的方法。感谢您在这些问题上的帮助。

我复制了您的代码,并将其直接粘贴到控制台应用程序中。它完全按照预期工作

您是否可以向我们展示其他可能对结果产生影响的内容

这是我使用的完整示例,以防您正在做一些不同的事情

string xml = 
@"<?xml version='1.0' encoding='utf-8' ?> 
  <object>
    <body>tests</body> 
    <send_results type='null' /> 
    <note_class>none</note_class> 
    <users type='list' /> 
    <title>test</title> 
    <time_sent type='null' /> 
    <image type='null' /> 
    <to_customers type='boolean'>False</to_customers> 
    <time_created>2013-06-26T16:40:50</time_created> 
    <num_sends type='integer'>0</num_sends> 
    <time_scheduled type='null' /> 
    <dealership>/api/v1/dealerships/10/</dealership> 
    <id type='integer'>22</id> 
    <send_rate>none</send_rate> 
    <send_method>email</send_method> 
    <reply_to_email>do_not_reply@williamson-cadillac.com</reply_to_email> 
    <response_link type='null' /> 
    <to_users type='boolean'>True</to_users> 
    <resource_uri>/api/v1/notifications/22/</resource_uri> 
  </object>";
var parsedXml = XDocument.Parse(xml);
var query = from m in parsedXml.Descendants("object")
            select new Notifications
            {
                Body = (string)m.Element("body"),
                SendResults = (string)m.Element("send_results"),
                NoteClass = (string)m.Element("note_class"),
                Users = m.Element("users").Elements().Select(e => (string)e.Element("value")).ToList(),
                Title = (string)m.Element("title"),
                TimeSent = (string)m.Element("time_sent"),
                Image = (string)m.Element("image"),
                ToCustomers = (string)m.Element("to_customers"),
                TimeCreated = (string)m.Element("time_created"),
                NumSends = (string)m.Element("num_sends"),
                TimeScheduled = (string)m.Element("time_scheduled"),
                Dealership = (string)m.Element("dealership"),
                Id = (string)m.Element("id"),
                SendRate = (string)m.Element("send_rate"),
                SendMethod = (string)m.Element("send_method"),
                ReplyToEmail = (string)m.Element("reply_to_email"),
                ResponseLink = (string)m.Element("response_link"),
                ToUsers = (string)m.Element("to_users"),
                ResourceUri = (string)m.Element("resource_uri"),
            };

Console.WriteLine("Number of items = {0}, {1}",query.Count(), query.FirstOrDefault().Body);
Console.ReadLine(); 
stringxml=
@" 
测验
没有一个
试验
假的
2013-06-26T16:40:50
0
/api/v1/经销商/10/
22
没有一个
电子邮件
不要_reply@williamson-卡迪拉克网站
真的
/api/v1/notifications/22/
";
var parsedXml=XDocument.Parse(xml);
var query=来自parsedXml.substands(“对象”)中的m
选择新通知
{
Body=(字符串)m.Element(“Body”),
SendResults=(string)m.Element(“send_results”),
NoteClass=(字符串)m.Element(“note_class”),
Users=m.Element(“Users”).Elements()。选择(e=>(字符串)e.Element(“value”)).ToList(),
Title=(字符串)m.Element(“Title”),
TimeSent=(字符串)m.Element(“发送的时间”),
Image=(字符串)m.Element(“Image”),
ToCustomers=(string)m.Element(“to_customers”),
TimeCreated=(string)m.Element(“time_created”),
NumSends=(字符串)m.Element(“num_发送”),
TimeScheduled=(字符串)m.Element(“计划的时间”),
经销商=(字符串)m.Element(“经销商”),
Id=(字符串)m.Element(“Id”),
SendRate=(字符串)m.Element(“发送速率”),
SendMethod=(string)m.Element(“send_方法”),
ReplyToEmail=(字符串)m.Element(“reply_to_email”),
ResponseLink=(字符串)m.Element(“响应链接”),
ToUsers=(字符串)m.Element(“给用户”),
ResourceUri=(字符串)m.Element(“资源uri”),
};
WriteLine(“项目数={0},{1}”、query.Count()、query.FirstOrDefault().Body);
Console.ReadLine();

您没有显示正在解析的XML,我们理所当然地认为它已正确完成。可以肯定的是,您应该从文件中加载它,或者像这样解析字符串

//Load Xml file
var document = XDocument.Load(@"c:\temp\test.xml");

//Parse Xml 
var document = XDocument.Parse(xml);
如果在起始于
var query
的行上放置断点,那么当它点击check
parsedXml
时,确保它具有预期值

另外,您应该有这样的功能,您当前缺少一个根节点

  <?xml version="1.0" encoding="utf-8" ?> 
  <objects>
     <object>
         ...
     <object>
  </objects>

...

最后,如果您已经有了一个这样反序列化的类,那么使用LINQ与反序列化是不同的。如果您只是选择一个现有类,那么LINQ就是您想要的。确保您正在使用正确的工具进行作业。

请包含如何创建
parsedXml
的代码。您可以编译该代码吗?因为它是
substands
而不是
decentants
像p.s.w.g发布的那样,除非我们看到它是如何创建的,否则我们不能做很多事情。但您可以单击此链接以作为检查well@CSharpie你为什么喜欢其中一个?我知道,在过去,.Elements()比.subjections()更适合人们的需要。是Jsut提出的,不是暗示。虽然这是一个好观点,但它并没有回答问题。这是一种观点。我怀疑这一问题是由于其他原因造成的。我希望op可以提供更多细节,如果他/她仍然有问题。这仍然应该是一个评论。我同意。。。除了你不能在评论中放截图。我认为“在我的机器上工作”是一种没有证据的逃避。
  <?xml version="1.0" encoding="utf-8" ?> 
  <objects>
     <object>
         ...
     <object>
  </objects>