2016-05-26 13 views
2

特定のノードの属性値に基づいて値を取得する必要があるLinqからXmlクエリがあります。アイテムのリストを取得しようとしていますが、ノードの1つに値を取得する方法が見つからないような属性があります。私は短いそれを維持するために2つの項目を表示しています属性に基づいて値を取得するLinqとXML

<codelist-items> 
    <codelist-item> 
     <code>1</code> 
     <name> 
      <narrative>Planned start</narrative> 
      <narrative xml:lang="fr">Début prévu</narrative> 
     </name> 
     <description> 
      <narrative> 
       The date on which the activity is planned to start, for example the date of the first planned disbursement or when physical activity starts. 
      </narrative> 
     </description> 
    </codelist-item> 
    <codelist-item> 
     <code>2</code> 
     <name> 
      <narrative>Actual start</narrative> 
      <narrative xml:lang="fr">Début réel</narrative> 
     </name> 
     <description> 
      <narrative> 
       The actual date the activity starts, for example the date of the first disbursement or when physical activity starts. 
      </narrative> 
     </description> 
    </codelist-item> 
</codelist-items> 

: は、ここにXMLです。

XElement xelement = XElement.Load(xmlFile); 

var elements = from adt in xelement.Elements("codelist-items").Elements("codelist-item") 
       select new ActivityDateType 
       { 
        Code = (string)adt.Element("code"), 
        NameEng = (string)adt.Element("name").Element("narrative"), 
        NameFra = (string)adt.Element("name").Element("narrative[@xml:lang='fr']"), 
        Description = (string)adt.Element("description") 
       }; 

return elements; 

誰でもNameFraの値を取得する方法を知っている:「:LANG = 『FR』 XML」属性とここに私のLINQクエリを試してみて、そこにある「名前/物語」から値を取得するのですか?

おかげ

答えて

0

あなたは、その属性値によって要素をフィルタリング述語とLINQ FirstOrDefault()を使用することができ、次のいずれか

NameFra = (string)adt.Element("name") 
        .Elements("narrative") 
        .FirstOrDefault(o => (string)o.Attribute(XNamespace.Xml+"lang") == "fr"), 

か、すでに属性フィルタリングロジックが含まれているあなたのXPath式を実行するためにXPathSelectElement()拡張機能を使用します。

NameFra = (string)adt.Element("name") 
        .XPathSelectElement("narrative[@xml:lang='fr']", nsmgr), 

後者はさらに次のように単純化することができます。

NameFra = (string)adt.XPathSelectElement("name/narrative[@xml:lang='fr']", nsmgr), 

nsmgr以前に次のように宣言されていると仮定:XPathは接頭xml含まれているため

var nsmgr = new XmlNamespaceManager(new NameTable()); 

nsmgrが必要であった(XPathSelectElement()は不満私は名前空間のマネージャーなしでちょうどXPath文字列引数を受け入れるオーバーロードを使用する場合) 。

+0

ありがとうhar07、それは私が必要としたものです。 – devguy

関連する問題