繁体   English   中英

使用Linq从复杂的XML中提取数据

[英]Extract data from complex XML using Linq

嗨,我有一个XML,如下所示

<Feed>
<Control>
    <UserName>testUser</UserName>
    <Password>testPass</Password>
</Control>
<leeds>
    <leed>
        <leedid>4990935</leedid>
        <Reference>4990935</Reference>
        <AccidentDetails>
            <IncidentDate>2015-08-05</IncidentDate>
            <AccidentDetails>damage</AccidentDetails>
        </AccidentDetails>
        <ClientDetails>
            <ClientsID>4990935</ClientsID>
            <ClientsName>Test Name</ClientsName>
        </ClientDetails>
        <IncidentDetails>
            <IncidentID>557475</IncidentID>
            <IncidentName>Injury</IncidentName>
        </IncidentDetails>
    </leed>
<leed>
.......... More Leeds 
</leed>


现在,我正在尝试使用以下Linq提取数据,但是它不能正常工作,请您帮忙。

XDocument xmlDoc = XDocument.Load(path);

        var results = from job in xmlDoc.Root.Elements("Control")
                      let Repairer = job.Parent.Elements("Leeds").FirstOrDefault()

                      select new Job {
                          Username = (string)job.Element("leedid"),
                          Password = (string)job.Element("Reference"),
                          IncidentDetail = (string)job.Element("IncidentDetail"),
                          ClientsName = (string)job.Element("ClientsName"),
                          IncidentName = (string)Repairer.Element("IncidentName")
                      };
                      return result;

我有模特班

public class Control {
    public string Username { get; set; }

    public string Password { get; set; }

    public Leed leeds {get; set;}
} 

public class Leed {

    public int leedid { get; set; }

    public int Reference { get; set; }

    public string IncidentDate { get; set; }

    public string IncidentDetail { get; set; }

    public string ClientsID { get; set; }

    public string ClientsName { get; set; }

    public string IncidentID { get; set; }

    public string IncidentName { get; set; }
}

我对Linq和XML非常陌生,一个Feed将拥有一个控件和多个选项。

为了使它正常工作,我不得不做出很多改变。 标记名称必须与xml使用相同的大写/小写字母

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml =
               "<Feed>" +
                  "<Control>" +
                    "<UserName>testUser</UserName>" +
                    "<Password>testPass</Password>" +
                  "</Control>" +
                  "<leeds>" +
                    "<leed>" +
                      "<leedid>4990935</leedid>" +
                      "<Reference>4990935</Reference>" +
                      "<IncidentDetails>" +
                        "<IncidentDate>2015-08-05</IncidentDate>" +
                        "<AccidentDetails>damage</AccidentDetails>" +
                      "</IncidentDetails>>" +
                        "<ClientDetails>" +
                          "<ClientsID>4990935</ClientsID>" +
                          "<ClientsName>Test Name</ClientsName>" +
                        "</ClientDetails>" +
                        "<IncidentDetails>" +
                          "<IncidentID>557475</IncidentID>" +
                          "<IncidentName>Injury</IncidentName>" +
                        "</IncidentDetails>" +
                      "</leed>" +
                  "</leeds>" +
                "</Feed>";
            XDocument xmlDoc = XDocument.Parse(xml);

            var results = xmlDoc.Descendants("Feed").Select(feed => 
                          feed.Descendants("leed").Select(job => new Job
                          {
                              Username = (string)feed.Elements("Control").FirstOrDefault().Element("UserName"),
                              Password = (string)feed.Elements("Control").FirstOrDefault().Element("Password"),
                              IncidentDetail = string.Join(",", job.Element("IncidentDetails").Elements().Select(x => x.Value)),
                              ClientsName = (string)job.Elements("ClientsName").FirstOrDefault(),
                              IncidentName = (string)job.Descendants("IncidentName").FirstOrDefault()
                          }).ToList()).ToList();
        }
    }
    public class Job
    {
        public string Username { get; set; }

        public string Password { get; set; }

        public int leedid { get; set; }

        public int Reference { get; set; }

        public string IncidentDate { get; set; }

        public string IncidentDetail { get; set; }

        public string ClientsID { get; set; }

        public string ClientsName { get; set; }

        public string IncidentID { get; set; }

        public string IncidentName { get; set; }
    }
}

​

根据您的XML,您的Control类不正确。 由于您可能在leeds有多个leed标签,因此您在Control类中应该具有类似的映射,因此应将其更改为接受一个集合,而不是像这样:

 public List<Leed> leeds { get; set; }

现在,将leeds节点存储在局部变量leeds ,最后再次循环以获取多个leeds

这应该给您预期的输出:

List<Control> result = (from job in xdoc.Root.Elements("Control")
         let leeds = job.Parent.Element("leeds")
         select new Control
            {
               Username = (string)job.Element("UserName"),
               Password = (string)job.Element("Password"),
               leeds = (from leed in leeds.Elements("leed")
                     let AccidentDtls = leed.Element("AccidentDetails")
                     let ClientDetails = leed.Element("ClientDetails")
                     let IncidentDtls = leed.Element("IncidentDetails")
                     select new Leed
                        {
                          leedid = (int)leed.Element("leedid"),
                          Reference = (int)leed.Element("Reference"),
                          IncidentDate = (string)AccidentDtls.Element("IncidentDate"),
                          IncidentDetail = (string)AccidentDtls.Element("IncidentDetail"),
                          ClientsID = (string)ClientDetails.Element("ClientsID"),
                          ClientsName = (string)ClientDetails.Element("ClientsName"),
                          IncidentID = (string)IncidentDtls.Element("IncidentID"),
                          IncidentName = (string)IncidentDtls.Element("IncidentName")
                        }).ToList()
           }).ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM