如何解析此XML记录中的值

时间:2014-02-17 05:24:55

标签: c# .net xml linq linq-to-xml

我有IEnumerable<XElement> rates,其中包含以下XML /数据。

<results>
  <rate id="AUDEUR">
    <Name>AUD to EUR</Name>
    <Rate>0.6602</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>0.6604</Ask>
    <Bid>0.66</Bid>
  </rate>
  <rate id="AUDGBP">
    <Name>AUD to GBP</Name>
    <Rate>0.5391</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>0.5393</Ask>
    <Bid>0.5389</Bid>
  </rate>
  <rate id="AUDUSD">
    <Name>AUD to USD</Name>
    <Rate>0.9051</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>0.9054</Ask>
    <Bid>0.9048</Bid>
  </rate>
  <rate id="EURAUD">
    <Name>EUR to AUD</Name>
    <Rate>1.5147</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>1.5153</Ask>
    <Bid>1.5141</Bid>
  </rate>
  <rate id="EURGBP">
    <Name>EUR to GBP</Name>
    <Rate>0.8166</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>0.8167</Ask>
    <Bid>0.8165</Bid>
  </rate>
  <rate id="EURUSD">
    <Name>EUR to USD</Name>
    <Rate>1.3709</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>1.371</Ask>
    <Bid>1.3709</Bid>
  </rate>
  <rate id="GBPAUD">
    <Name>GBP to AUD</Name>
    <Rate>1.8549</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>1.8556</Ask>
    <Bid>1.8541</Bid>
  </rate>
  <rate id="GBPEUR">
    <Name>GBP to EUR</Name>
    <Rate>1.2246</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>1.2247</Ask>
    <Bid>1.2244</Bid>
  </rate>
  <rate id="GBPUSD">
    <Name>GBP to USD</Name>
    <Rate>1.6788</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>1.679</Ask>
    <Bid>1.6787</Bid>
  </rate>
  <rate id="USDAUD">
    <Name>USD to AUD</Name>
    <Rate>1.1049</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>1.1052</Ask>
    <Bid>1.1045</Bid>
  </rate>
  <rate id="USDEUR">
    <Name>USD to EUR</Name>
    <Rate>0.7294</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>0.7295</Ask>
    <Bid>0.7294</Bid>
  </rate>
  <rate id="USDGBP">
    <Name>USD to GBP</Name>
    <Rate>0.5957</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>0.5957</Ask>
    <Bid>0.5956</Bid>
  </rate>
</results>
    base {System.Xml.Linq.XContainer}: <results>
  <rate id="AUDEUR">
    <Name>AUD to EUR</Name>
    <Rate>0.6602</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>0.6604</Ask>
    <Bid>0.66</Bid>
  </rate>
  <rate id="AUDGBP">
    <Name>AUD to GBP</Name>
    <Rate>0.5391</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>0.5393</Ask>
    <Bid>0.5389</Bid>
  </rate>
  <rate id="AUDUSD">
    <Name>AUD to USD</Name>
    <Rate>0.9051</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>0.9054</Ask>
    <Bid>0.9048</Bid>
  </rate>
  <rate id="EURAUD">
    <Name>EUR to AUD</Name>
    <Rate>1.5147</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>1.5153</Ask>
    <Bid>1.5141</Bid>
  </rate>
  <rate id="EURGBP">
    <Name>EUR to GBP</Name>
    <Rate>0.8166</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>0.8167</Ask>
    <Bid>0.8165</Bid>
  </rate>
  <rate id="EURUSD">
    <Name>EUR to USD</Name>
    <Rate>1.3709</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>1.371</Ask>
    <Bid>1.3709</Bid>
  </rate>
  <rate id="GBPAUD">
    <Name>GBP to AUD</Name>
    <Rate>1.8549</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>1.8556</Ask>
    <Bid>1.8541</Bid>
  </rate>
  <rate id="GBPEUR">
    <Name>GBP to EUR</Name>
    <Rate>1.2246</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>1.2247</Ask>
    <Bid>1.2244</Bid>
  </rate>
  <rate id="GBPUSD">
    <Name>GBP to USD</Name>
    <Rate>1.6788</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>1.679</Ask>
    <Bid>1.6787</Bid>
  </rate>
  <rate id="USDAUD">
    <Name>USD to AUD</Name>
    <Rate>1.1049</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>1.1052</Ask>
    <Bid>1.1045</Bid>
  </rate>
  <rate id="USDEUR">
    <Name>USD to EUR</Name>
    <Rate>0.7294</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>0.7295</Ask>
    <Bid>0.7294</Bid>
  </rate>
  <rate id="USDGBP">
    <Name>USD to GBP</Name>
    <Rate>0.5957</Rate>
    <Date>2/17/2014</Date>
    <Time>12:07am</Time>
    <Ask>0.5957</Ask>
    <Bid>0.5956</Bid>
  </rate>
</results>

根据这些数据,我需要在DB中添加记录。要添加以下值:

    来自<rate id="AUDEUR">
  1. ID,在这种情况下,它将是AUDEUR
  2. <Rate>0.6602</Rate>开始,在这种情况下,它将是0.6602
  3. <Date>2/17/2014</Date>
  4. 的日期

    我对XML没有多少经验,你能帮助我如何获得这些价值吗?

    由于

3 个答案:

答案 0 :(得分:0)

您可以使用Linq2Xml

XElement doc=XElement.Load(url);
var elements=doc.Elements("rate")
                .Where(x=>
                         x.Attribute("id").Value=="AUDEUR" &&
                         (double)x.Element("Rate")>=0.6602 &&
                         DateTime.Compare((DateTime)x.Element("Date"),DateTime.Parse("2/17/2014"))>=0
                      )
                .Select(e=>
                            new
                           {
                                Id=e.Attribute("id").Value,
                                Name=e.Element("Name").Value,
                                Rate=e.Element("Rate").Value....
                           }
                       );

现在你可以迭代这样的元素

foreach(var elm in elements)
{
    elm.Name;
    elm.Rate;
}

答案 1 :(得分:0)

我会创建一个处理费率的类:

class Rate
{
    public string Id { get; private set; }
    public decimal Value { get; private set; }
    public DateTime Date { get; private set; }

    // let's make the class immutable
    public Rate(string id, decimal value, DateTime date)
    {
        Id = id;
        Value = value;
        Date = date;
    }
}

并使用LINQ to XML来解析XML:

private static IEnumerable<Rate> GetRates(XElement source)
{
    return from r in source.Element("results").Elements("rate")
           select new Rate(
               (string)r.Attribute("id"),
               (decimal)r.Element("rate"),
               (DateTime)r.Element("date"));
}

我不确定你为什么说你有IEnumerable<XElement>,但假设你拥有的是什么,你可以轻松地从IEnumerable<XElement>获得费率:

var data = rates.SelectMany(x => GetRates(x)).ToList();

它会为您提供List<Rate>,您可以使用它来更新数据库。

答案 2 :(得分:0)

让我们代表一个如下课程的费率记录:

public class RateRecord {
    public string Id { get; set; }
    public string Rate { get; set; }
    public string Date { get; set; }
}

获取解析率列表:

var rateRecords = new List<RateRecord>();
foreach(var rate in rates) {
    rateRecords.Add(new RateRecord {
        Id = rate.Attribute("id").Value,
        Rate = rate.Element("Rate").Value,
        Date = rate.Element("Date").Value
    });
}

你也可以编写一个解析方法:

public IEnumerable<RateRecord> ParseRates(IEnumerable<XElement> rates) {
    foreach(var rate in rates) {
        yield return new RateRecord {
            Id = rate.Attribute("id").Value,
            Rate = rate.Element("Rate").Value,
            Date = rate.Element("Date").Value
        };
    }
}
相关问题