LINQ根据属性值过滤XML读取子元素值

本文关键字:读取 元素 XML 过滤 属性 LINQ | 更新日期: 2023-09-27 18:10:36

我是LINQ到XML的新手,我有以下示例部分工作,但我卡住了如何读取元素值之一,CustomFieldResponse/values/Value当CustomFieldResponse的FieldCode属性等于"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();
}

LINQ根据属性值过滤XML读取子元素值

使用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();

这个怎么样:

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