LINQ基于值加载特定的XML数据

时间:2013-04-04 16:45:35

标签: xml linq select

也许有人可以帮助解决我遇到的问题。我有这个XML数据:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<data>
<header>
    <version>3.1</version>
    <date>2013-04-02</date>
    <filedate>2013-04-02</filedate>
</header>
<value>
    <TypeId>67772764</TypeId>
    <ServiceID>GN1600</ServiceID>
    <EvbAsof>2013-04-02</EvbAsof>
    <Rating>2</Rating>
    <AdditionalColumns>
        <Name>EvbAvg</Name>
        <Value>7.29495</Value>
    </AdditionalColumns>
    <AdditionalColumns>
        <Name>EvbHigh</Name>
        <Value>12.46</Value>
    </AdditionalColumns>
    <AdditionalColumns>
        <Name>EvbLow</Name>
        <Value>2.88563</Value>
    </AdditionalColumns>
    <AdditionalColumns>
        <Name>EvbBench</Name>
        <Value>1.86241</Value>
    </AdditionalColumns>
</value>

... ...

我需要为每个节点提取以下数据:

  • 标题节点的日期
  • TYPEID
  • 服务ID
  • 评分
  • 来自AditionalColumns的EvbAvg值
  • 来自AditionalColumns的EvbBench值

我设法获得TypeID,ServiceID和Rating,但我无法弄清楚如何从头部获取日期,并从同一查询中的AditionalColumns节点获取EvbAvg和EvbBench。 到目前为止,这是我的代码:

    var ServiceDesc = from c in XElement.Load("download.xml").Elements("value")
                       select new
                       {
                           TypeID = c.Element("TypeId").Value,
                           ServiceID = c.Element("ServiceID").Value,
                           Rating = c.Element("Rating").Value
                       }

如果有人能帮助我,我会非常感激。 非常感谢!

2 个答案:

答案 0 :(得分:0)

假设您有一个header元素和一个value元素,那么将它们作为集合访问它们的目的可能很小(如果每个元素有多个实例,我们如何匹配它们? )。

你可以按照以下方式尝试:

var doc = XElement.Load("download.xml");
var header = doc.Elements("header").Single();
var val = doc.Elements("value").Single();

var serviceDesc = new
{
   Date = DateTime.Parse(header.Element("date").Value,
                         System.Globalization.CultureInfo.InvariantCulture),
   TypeID = val.Element("TypeId").Value,
   ServiceID = val.Element("ServiceID").Value,
   Rating = val.Element("Rating").Value,
   EbvAvg = val.Descendants("AdditionalColumns")
               .Where(node => node.Descendants("Name").Single().Value == "EvbAvg")
               .Select(node => node.Descendants("Value").Single().Value)
               .Single(),
   EbvBench = val.Descendants("AdditionalColumns")
                 .Where(node => node.Descendants("Name").Single().Value == "EvbBench")
                 .Select(node => node.Descendants("Value").Single().Value)
                 .Single()                
};

答案 1 :(得分:0)

最后,我设法让文件供应商以更友好的方式更改格式。谢谢大家!