2014-02-17 2 views
0

У меня есть IEnumerable<XElement> rates со следующими XML/данными в нем.как анализировать значения из этих записей 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> 

На основании этих данных мне нужно добавить записи в БД. Следующие значения необходимы для добавления:

  1. идентификатор из <rate id="AUDEUR">, в данном случае это будет AUDEUR
  2. Цены от <Rate>0.6602</Rate>, в данном случае это будет 0,6602
  3. Дата от <Date>2/17/2014</Date>

У меня мало опыта с XML, можете ли вы, пожалуйста, помочь мне, как я могу получить эти ценности?

Благодаря

+0

попробуйте преобразовать xml в тип документа, тогда вы сможете его проанализировать. http://stackoverflow.com/a/55840/2334391 http://www.w3schools.com/xml/default.asp – jos

ответ

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; 
} 
+0

спасибо, я не уверен в значениях, поэтому не могу использовать vlaues в .Where , но имя полей будет одна и та же. Не могли бы вы посоветовать. – Toubi

+1

@Toubi amuming вы хотите фильтровать элементы с идентификатором 'AUDEUR' и тарифами> = 0,6602. В случае, если вы не хотите фильтровать, вы можете удалить предложение where – Anirudha

+0

извините, но как я могу включить id в предложение select, пожалуйста руководство. – Toubi

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 к 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>, который вы можете использовать для обновления базы данных.

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 
     }; 
    } 
} 
Смежные вопросы