我有一个如下所示的XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<response uri="/crm/private/xml/Leads/getRecords">
<Leads>
<row no="1">
<FL val="LEADID">2000000022020</FL>
<FL val="SMOWNERID">2000000018005</FL>
<FL val="Lead Owner">John</FL>
<FL val="Company">Zillium</FL>
<FL val="First Name">Scott</FL>
<FL val="Last Name">James</FL>
<FL val="Designation">null</FL>
<FL val="Email">null</FL>
<FL val="Phone">null</FL>
<FL val="Fax">null</FL>
<FL val="Mobile">null</FL>
<FL val="Website">null</FL>
<FL val="Lead Source">null</FL>
<FL val="Lead Status">null</FL>
<FL val="No of Employees">0</FL>
<FL val="Annual Revenue">0.0</FL>
</row>
<row no="2">
<FL val="LEADID">2000000022020</FL>
<FL val="SMOWNERID">2000000018005</FL>
<FL val="Lead Owner">John</FL>
<FL val="Company">Zillium</FL>
<FL val="First Name">Scott</FL>
<FL val="Last Name">James</FL>
<FL val="Designation">null</FL>
<FL val="Email">null</FL>
<FL val="Phone">null</FL>
<FL val="Fax">null</FL>
<FL val="Mobile">null</FL>
<FL val="Website">null</FL>
<FL val="Lead Source">null</FL>
<FL val="Lead Status">null</FL>
<FL val="No of Employees">0</FL>
<FL val="Annual Revenue">0.0</FL>
</row>
</Leads>
</response>
我正在尝试读取行元素中的“键/值”对,但我似乎无法掌握如何使用Linq来实现它。
我需要将数据“反序列化”为一个简单的POCO
public class Leads
{
public long LEADID { get; set; }
public long SMOWNERID { get; set; }
public string LeadOwner { get; set; }
public string Company { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Designation { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public string Fax { get; set; }
public string Mobile { get; set; }
public string Website { get; set; }
public string LeadSource { get; set; }
public string LeadStatus { get; set; }
public int NoOfEmployees { get; set; }
public decimal AnnualRevenue { get; set; }
}
我的问题是,所有元素都具有相同的名称,因此我需要获取与元素值配对的attribut值(val)。
所以我的问题是,使用Linq是否有一种聪明的方法可以做到这一点。
否则我的解决方法是编写XLS并将XML转换为更可反序列化的XML格式。
答案 0 :(得分:3)
您可以选择
之类的每个值let company = (string)r.Elements()
.Single(x => (string)x.Attribute("val") == "Company")
但我相信将所有元素投射到字典中会更快(并且更具可读性)
var query =
xdoc.Descendants("row")
.Select(r => r.Elements().ToDictionary(f => (string)f.Attribute("val")))
.Select(d => new Leads {
LEADID = (long)d["LEADID"],
SMOWNERID = (long)d["SMOWNERID"],
Company = (string)d["Company"]
// etc
});
另请注意,您需要使用long
作为前两个属性(根据示例xml中的值)。
答案 1 :(得分:0)
var xdoc = XDocument.Parse(xmlstring);
xdoc.Elements("response").Elements("Leads").Elements("row").Select(l => new Leads()
{
LEADID = (long)l.Elements("FL").Where(fl => (string)fl.Attribute("val") == "LEADID").FirstOrDefault(),
SMOWNERID = (long)l.Elements("FL").Where(fl => (string)fl.Attribute("val") == "SMOWNERID").FirstOrDefault(),
etc..
});