[英]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.