使用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提取数据,但是它不能正常工作,请您帮忙.
Now I am trying to Extract Data Using the Following Linq but its not working could you please help.
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将拥有一个控件和多个选项.
I am very new in Linq and XML, One Feed will have one control and multiple leeds.
推荐答案
根据您的XML,您的Control
类不正确.由于您可能在leeds
中包含多个leed
标记,因此您在Control
类中应该具有类似的映射,因此请将其更改为接受一个集合,而不是这样:-
As per your XML, your Control
class in not correct. Since you may have multiple leed
tags inside leeds
so you should have similar mapping in your Control
class, so change it to accept a collection instead like this:-
public List<Leed> leeds { get; set; }
现在,将leeds
节点存储在局部变量leeds
中,最后再次循环多个leeds
.
Now, store the leeds
node inside a local variable leeds
, finally loop again for multiple leeds
.
这应该给您预期的输出:-
This should give you the expected output:-
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();
这篇关于使用Linq从复杂的XML中提取数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!