2016-03-24 4 views
2

Это мой XMLLinq для XML атрибут кондиционирования

<DataSet xmlns="http://www.bnr.ro/xsd" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.bnr.ro/xsd nbrfxrates.xsd"> 
    <Header> 
     <Publisher>National Bank of Romania</Publisher> 
     <PublishingDate>2016-03-24</PublishingDate> 
    <MessageType>DR</MessageType> 
    </Header> 
    <Body> 
     <Subject>Reference rates</Subject> 
     <OrigCurrency>RON</OrigCurrency> 
     <Cube date="2016-03-24">    
      <Rate currency="EUR">4.4655</Rate>   
     </Cube> 
     <Cube date="2016-03-23">     
      Rate currency="EUR">4.4641</Rate>    
     </Cube> 
    </Body> 
</DataSet> 

Я хочу проверить Куб Атрибут дату получить значение EUR от даты вчера.

Например, если сегодня 2016-03-24 Я хочу получить значение 4.4641 с 2016-03-23.

Я попытался с помощью LINQ к XML

string date_yesterday = DateTime.Now.AddDays(-1).Date.ToString("yyyy-MM-dd"); 
XElement root = XElement.Parse(sbXmlText.ToString()); 
       IEnumerable<XElement> adress = 
        from el in root.Descendants("Cube") 
        let z = el.ElementsAfterSelf().FirstOrDefault() 
        where z != null && (string)el.Attribute("date") == date_yesterday 
        select el; 
       foreach (XElement el in adress) 
        Console.WriteLine(el); 

И попытался

string date_yesterday = DateTime.Now.AddDays(-1).Date.ToString("yyyy-MM-dd"); 

      XElement root = XElement.Parse(sbXmlText.ToString()); 
      IEnumerable<XElement> adress = 
       root.Descendants("Cube").Where(r => r.Attribute("date").Value == date_yesterday);      
      foreach (XElement el in adress) 
       Console.WriteLine(el); 

И это возвращает каждый раз нуль

+0

Не можете вы просто скопировать и вставить в XML, вместо публикации его картины? – har07

+0

извините, я изменил –

ответ

2

Ваш XML имеет имен по умолчанию. Вы можете использовать "имя-местныйXNamespace + элемента" для ссылки на элемент в пространстве имен, например:

var xml = @"<DataSet xmlns='http://www.bnr.ro/xsd' 
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' 
xsi:schemaLocation='http://www.bnr.ro/xsd nbrfxrates.xsd'> 
    <Header> 
     <Publisher>National Bank of Romania</Publisher> 
     <PublishingDate>2016-03-24</PublishingDate> 
    <MessageType>DR</MessageType> 
    </Header> 
    <Body> 
     <Subject>Reference rates</Subject> 
     <OrigCurrency>RON</OrigCurrency> 
     <Cube date='2016-03-24'>    
      <Rate currency='IDR'>1.1111</Rate> 
      <Rate currency='EUR'>4.4655</Rate>   
     </Cube> 
     <Cube date='2016-03-23'>     
      <Rate currency='EUR'>4.4641</Rate>    
     </Cube> 
    </Body> 
</DataSet>"; 
var doc = XDocument.Parse(xml); 

//XNamespace that reference default namespace URI: 
XNamespace d = "http://www.bnr.ro/xsd"; 

var yesterday = DateTime.Now.AddDays(-1).Date; 

//Use `XNamespace+element's local-name` to reference element in namespace: 
var result = (from cube in doc.Descendants(d+"Cube") 
       from rate in cube.Elements(d+"Rate") 
       where 
       ((DateTime)cube.Attribute("date")).Date == yesterday 
        && 
       (string)rate.Attribute("currency") == "EUR" 
       select (decimal)rate 
      ).FirstOrDefault(); 
Console.WriteLine(result); 

выход:

4.4641 
+0

Спасибо. И у меня есть другой вопрос. Если у меня есть два тега с Rate, и я хочу тот, где currency = «EUR», я напишу в select select равное условие? –

+0

@RalucaIonescu вы можете использовать конструкцию LINQ 'SelectMany()', которая преобразуется в [double 'from' clause в синтаксисе запроса] (http://stackoverflow.com/questions/6414816/is-there-ac-sharp-linq- syntax-for-the-query-selectmany-method)) и добавьте фильтр валют в предложение 'where'. См. Обновленный ответ – har07

+0

Да, я видел обновленный ответ. большое спасибо –

Смежные вопросы