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