首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用XDocument和LINQ对元素解析XML

用XDocument和LINQ对元素解析XML
EN

Stack Overflow用户
提问于 2013-12-17 09:40:20
回答 3查看 444关注 0票数 2

我试图使用XDocument解析xml文档,但是我对XML非常陌生,过去只使用过JSON。到目前为止,我可以解析每个报表名,但仍然无法解析参数列表。当没有节点区分不同的参数时,如何解析参数列表?

代码语言:javascript
运行
复制
var reports = xml.Descendants("Report").Select(reportElement => new
{
    Name = reportElement.Attribute("Name").Value,
    Parameters = reportElement.Descendants("ParameterList").Select(parameter => new
    {
    })
});

XML:

代码语言:javascript
运行
复制
<ReportList>
    <Report Name="JobNotClose">
        <ParameterList>
            <Name>@StationCode</Name><Value>LAX</Value>
            <Name>@ShipmentType</Name><Value>SE|SI</Value>
        </ParameterList>
    </Report>
    <Report Name="JobWithoutSales">
        <ParameterList>
            <Name>@StationCode</Name><Value>PA</Value>
            <Name>@JobDateFrom</Name><Value>2013-10-1</Value>
            <Name>@JobDateTo</Name><Value>2013-10-31</Value>
        </ParameterList>
    </Report>
</ReportList>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-17 10:28:46

可以使用Enumerable.Zip将参数名称序列与参数值序列合并:

代码语言:javascript
运行
复制
var reports = from r in xml.Root.Elements("Report")
              let parameters = r.Element("ParameterList")
              select new {
                  Name = (string)r.Attribute("Name"),
                  Parameters = parameters.Elements("Name")
                                         .Zip(parameters.Elements("Value"), 
                                              (n,v) => new { 
                                                  Name = (string)n, 
                                                  Value = (string)v 
                                              })
              };

这提供了以下报告的收集:

代码语言:javascript
运行
复制
[
  {
    "Name": "JobNotClose",
    "Parameters": [
      {
        "Name": "@StationCode",
        "Value": "LAX"
      },
      {
        "Name": "@ShipmentType",
        "Value": "SE|SI"
      }
    ]
  },
  {
    "Name": "JobWithoutSales",
    "Parameters": [
      {
        "Name": "@StationCode",
        "Value": "PA"
      },
      {
        "Name": "@JobDateFrom",
        "Value": "2013-10-1"
      },
      {
        "Name": "@JobDateTo",
        "Value": "2013-10-31"
      }
    ]
  }
]
票数 2
EN

Stack Overflow用户

发布于 2013-12-17 10:03:47

试试这个(我的意思是使用):

代码语言:javascript
运行
复制
var reports = xml.Descendants("Report").Select(reportElement => new
{
    Name = reportElement.Attribute("Name").Value,
    Parameters = reportElement.Descendants("ParameterList").Select(parameter => 
    {
        List<string> names = parameter.Elements("Name").Select(x=>x.Value).ToList();
        List<string> values = parameter.Elements("Value").Select(x=>x.Value).ToList();

        List<object>  pairs=new List<object>();

        for (int i = 0; i < names.Count; i++)
        {
            pairs.Add(new { Name = names[i], Value = values[i] });
        }

        return pairs;                    
    }).ToList()
}).ToList();

您可以删除两个ToList()调用。这只会让它更容易测试。当然,在您的XML中,<Name> <Value>标记并不总是完整的(即没有ValueName )。您可以在执行for循环之前检查它。

编辑:另一种选择:

代码语言:javascript
运行
复制
Dictionary<string, List<Tuple<string, string>>> rep = new Dictionary<string, List<Tuple<string, string>>>();

foreach (XElement report in xml.Elements("Report"))
{
    rep.Add(report.Attribute("Name").Value, new List<Tuple<string, string>>());

    List<string> names = report.Elements("ParameterList").FirstOrDefault().Elements("Name").Select(x => x.Value).ToList();
    List<string> values = report.Elements("ParameterList").FirstOrDefault().Elements("Value").Select(x => x.Value).ToList();

    for (int i = 0; i < names.Count; i++)
    {
         rep[report.Attribute("Name").Value].Add(new Tuple<string, string>(names[i], values[i]));
    }
}
票数 1
EN

Stack Overflow用户

发布于 2013-12-17 10:01:58

也许这会奏效。

您可以使用ParameterList将IEnumerable元素作为XNode.ElementsAfterSelf。然后循环遍历结果集,并假定元素成对。

这将为您提供一种按元素在ParameterList中出现的顺序解析元素的方法,而不必担心.Descendants会扰乱顺序。

当然,这里最大的假设是元素总是成对的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20630641

复制
相关文章

相似问题

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