2016-10-13 5 views
1

ここには私のXMLのスニペットがあります。私がする必要がどのようなC#LinqでXMLを照合して一致するものを探す

<?xml version="1.0" encoding="UTF-8"?> 
<information_code version="3.5"> 
    <entry code="000" title="Function, data for plans and description"/> 
    <entry code="001" title="Title page"/> 
    <entry code="002" title="List of pages or data modules"/> 
    <entry code="003" title="Change records and highlights"/> 
    <entry code="004" title="Access illustration"/> 
</information_code> 

は、「タイトル」属性の値を返し、その後、私は私のクエリに渡す値に「コード」属性が一致しています。本当に難しいはずはありませんが、私は周りを円で回っています。

私は現在ここにいますが、常にマッチすることなくキャッチされます。明らかに私の質問に間違っています。

private string getInfoName(string infoCode) 
{ 
    XDocument mydoc = XDocument.Load(GlobalVars.pathToInfoCodes); 
    string name = string.Empty; 

    try 
    { 
     var entry = mydoc 
      .Elements("entry") 
      .Where(e => e.Attribute("code").Value == infoCode) 
      .Single(); 

     name = entry.Attribute("title").Value; 
    } 
    catch 
    { 
     MessageBox.Show("Info code not recognised: " + infoCode); 
    }   
    return name; 
} 

答えて

1

問題は、あなたがElementsを使用するときにのみ、この時点で<information_code>あるあなたが現在であるレベルで検索することである - ので、そこには<entry>要素はありません。

あなたは.Element("information_code").Elements("entry")を使用するか、または代わりに.Descendantsを使用することができます。

string wantedCode = "001"; 

var title = XDocument.Load(GlobalVars.pathToInfoCodes) 
     .Descendants("entry") 
     .Where(e => e.Attribute("code")?.Value == wantedCode) 
     .Select(e => e.Attribute("title").Value).FirstOrDefault(); 

あなたは、クエリの構文を使用しても行うことができます。 ?.構文はC#6.0 Nullの伝播であることを

var title = (from e in XDocument.Load("data.xml").Descendants("entry") 
      where e.Attribute("code")?.Value == wantedCode 
      select e.Attribute("title")?.Value).FirstOrDefault(); 

注:立派に見えるかもしれません。以前のC#版を使用している場合は、変数に属性を格納し、それがnullでないことを確認してからアクセスしてください。.Value

+0

本当にありがとうございます。 –

+0

@ Can'tCodeWon'tCode - あなたは歓迎です:) –

+0

常に、 'Value'プロパティを使ってキャスティングすることをお勧めします。 –

関連する問題