0

也许有人可以帮助解决我遇到的问题。我有这个 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>

……

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

  • 来自标头节点的日期
  • 类型ID
  • 服务标识
  • 评分
  • 来自附加列的 EvbAvg 值
  • 来自附加列的 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
                       }

如果有人可以帮助我,我将不胜感激。非常感谢!

4

2 回答 2

0

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

于 2013-04-11T16:42:01.887 回答
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()                
};
于 2013-04-05T23:10:06.727 回答