2016-05-26 5 views
2

Ich habe eine Linq zu Xml-Abfrage, die einen Wert basierend auf dem Attributwert eines bestimmten Knotens abrufen muss. Ich versuche, eine Liste von Elementen abzurufen, und einer der Knoten hat ein Attribut, von dem ich keine Möglichkeit finde, den Wert zu erhalten. Hier ist der XML:Linq to XML zum Abrufen von Wert basierend auf Attribut

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

ich nur 2 Artikel ich die Anzeige es kurz zu halten. Und hier ist meine Linq Abfrage den Wert von „name/Erzählung“ zu versuchen und zu holen, wo es einen „xml: lang =‚fr‘“ Attribut:

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; 

Wer weiß, wie man den Wert für NameFra zu bekommen?

Dank

Antwort

0

Sie entweder FirstOrDefault() LINQ mit Prädikat verwenden können, die das Element durch seinen Attributwert filtert:

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

Oder XPathSelectElement() Erweiterung verwenden, um Ihren XPath-Ausdruck auszuführen, die bereits Attributfilterlogik enthält:

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

Letzteres kann weiter vereinfacht werden zu:

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

nsmgr bisher wie folgt erklärt übernommen hat: Es wurde

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

nsmgr benötigt, da die XPath enthält Präfix xml (XPathSelectElement() beschwert, wenn ich die Überlastung, die ohne Namespace-Manager nur XPath String-Argument akzeptiert) .

+0

Dank har07, das ist genau das, was ich brauchte. – devguy