2016-03-24 19 views
2

Bu Dün tarihinden itibaren Euro değerini almak için Küp Özellik tarihini doğrulamak istediğinizLinq XML şartlandırma özniteliği

<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> 

benim xml olduğunu.

Örneğin, bugün 2016-03-24 ise, 2016-03-23'ten 4.4641 değerini almak istiyorum.

Ben 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); 

ile LINQ to çalıştı Ve

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); 

denedik Ve boş her şey döndürür

+0

sadece XML kopyala-yapıştır olamaz, bunun bir resmini göndermek yerine? – har07

+0

Üzgünüm, –

cevap

2

XML'niz varsayılan ad alanını sahiptir. Örneğin, ad alanında öğeye başvuru "XNamespace + öğenin yerel-name" kullanabilirsiniz:

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); 

çıkışı:

4.4641 
+0

'u değiştirdim. Teşekkür ederim. Ve başka bir sorum var. Eğer Rate ile iki etiketim varsa ve para birimi = "EUR" olanı seçmek istiyorum Eğer select cümlede bir eşit koşul yazacağım? –

+0

@RalucaIonescu LINQ 'SelectMany()' yapısını (sorgu sözdizimindeki [double 'from' deyimine] çevirir) kullanabilirsiniz (http://stackoverflow.com/questions/6414816/is-there-ac-sharp-linq- için sözdizimi-selectmany-method sözdizimi)) ve para birimi süzgecini 'where' maddesine ekleyin. Güncellenen cevabı görün – har07

+0

Evet Güncellenmiş cevabı gördüm. Çok teşekkür ederim –

İlgili konular