LINQ для чтения в XML значений дочерних элементов, отфильтрованных по значению атрибута

#c# #xml #linq

#c# #xml #linq

Вопрос:

Я новичок в LINQ to XML, и у меня частично работает следующий пример, но я застрял на том, как прочитать одно из значений элемента, CustomFieldResponse / Values / Value, когда атрибут FieldCode для CustomFieldResponse равен «Bio»

Два других значения ID и WebsiteID читаются нормально, без проблем, и я могу вставить их в свою таблицу SQL. Но я понятия не имею, как ссылаться на значение для Bio.

 <members>
   <member>
      <ID>BF175DE0</ID>
      <WebsiteID>19186</WebsiteID>
      <CustomFieldResponses>
         <CustomFieldResponse FieldCode="Bio" Visibility="">
            <Values>
               <Value>This is the value i am trying to put in bio</Value>
            </Values>
         </CustomFieldResponse>
         <CustomFieldResponse FieldCode="facebook" Visibility="">
            <Values>
               <Value>http://facebook.com/myidhere</Value>
            </Values>
         </CustomFieldResponse>
      </CustomFieldResponses>
   </member>
</members>



string ID, WebsiteID;


XElement xelement = XElement.Load("members.xml");
IEnumerable<XElement> members = xelement.Elements();

foreach (var member in members)
{
ID = member.Element("ID").Value;
WebsiteID = member.Element("WebsiteID").Value;

var bio = from a in member.Elements("CustomFieldResponses")
    from b in a.Elements("CustomFieldResponse")
    where b.Attribute("FieldCode").Value == "Bio"
    from c in b.Elements("Values")
    select new { bio = c.Element("Value").Value };


    SqlCommand dataCommand = new SqlCommand("INSERT Members (ID, WebsiteID, Bio) VALUES                 ('"   ID   "','"   WebsiteID   "','"   bio   "')", dataConnection);
    dataCommand.ExecuteNonQuery();

}
 

Ответ №1:

Как насчет использования XPath?

 var xpathQuery = "//CustomFieldResponse[@FieldCode='Bio']/Values/Value";
var val = xelement.XPathSelectElement(xpathQuery);
 

или с чистым Linq2Xml

 var value = (string)xelement.Descendants("CustomFieldResponse")
                    .Where(x => (string)x.Attribute("FieldCode") == "Bio")
                    .Descendants("Value")
                    .FirstOrDefault();
 

Ответ №2:

Как насчет этого:

 var bio = (from fieldResponseCollection in member.Elements("CustomFieldResponses")
    from fieldResponse in fieldResponseCollection.Elements("CustomFieldResponse")
    from responseValue in fieldResponse.Elements("Values")
    select responseValue.Element("Value")
    where fieldResponse.Attribute("FieldCode").Value == "Bio")
.First();