首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Linq从XML文件读取属性/值对

使用Linq从XML文件读取属性/值对
EN

Stack Overflow用户
提问于 2013-02-18 21:35:33
回答 2查看 1.5K关注 0票数 1

我有一个如下所示的XML文件:

代码语言:javascript
运行
复制
<?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>

我正在尝试读取row元素中的"key/value“对,但我似乎无法掌握如何使用Linq来做到这一点。

我需要将数据“反序列化”成一个简单的POCO

代码语言:javascript
运行
复制
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; }
}

我的问题是,所有元素都有相同的名称,所以我需要获取与元素值成对的属性值(val)。

所以我的问题是,有没有一种聪明的方法来使用Linq来做到这一点。

否则,我的变通方法就是编写一个XLS并将XML转换为一种更易反序列化的XML格式。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-18 21:42:34

可以选择每个值,如下所示

代码语言:javascript
运行
复制
let company = (string)r.Elements()
                       .Single(x => (string)x.Attribute("val") == "Company")

但我相信将所有元素投射到字典中会更快(可读性也更好)

代码语言:javascript
运行
复制
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中的值)。

票数 3
EN

Stack Overflow用户

发布于 2013-02-18 21:43:44

代码语言:javascript
运行
复制
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..
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14937606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档