2016-03-24 17 views
2

にこれは私が昨日の日からEUR値を受け取るためにキューブ属性日付を検証したいLINQの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> 

私のxmlです。

たとえば、今日が2016-03-24の場合、2016-03-23から4.4641の値を受け取りたいとします。

は私が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); 

にLINQで試してみました

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

を試してみましたが、それはnullを毎回返す

+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

ありがとうございました。私は別の質問があります。私がレートで2つのタグを持っていて、私は通貨= "EUR"を選択したい場合、私はselect節に等しい条件を書いていますか? –

+0

@RalucaIonescu LINQ 'SelectMany()'構文を使用することができます(クエリ構文の[double 'from'句]に変換されます)(http://stackoverflow.com/questions/6414816/is-there-ac-sharp-linq- syntax-for-the-queryable-selectmany-method))、 'where'節に通貨フィルターを追加します。更新された回答を参照 – har07

+0

はい私は更新された答えを見た。どうもありがとうございました –