如何用一个Linq查询获得XML属性和元素
本文关键字:XML 属性 元素 何用一 Linq 查询 | 更新日期: 2023-09-27 18:06:22
我有一个XML文档,看起来像这样:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<searchlayers>
<searchlayer whereClause="ProjectNumber=a">Herbicide</searchlayer>
<searchlayer whereClause="ProjectNumber=b">Herbicide - Point</searchlayer>
<searchlayer whereClause="ProjectNumber=c">miscellaneous</searchlayer>
<searchlayer whereClause="ProjectNumber=d">miscellaneous - Point</searchlayer>
<searchlayer whereClause="ProjectNumber=e">Regrowth Control</searchlayer>
<searchlayer whereClause="ProjectNumber=f">Regrowth Control - Point</searchlayer>
<searchlayer whereClause="ProjectNumber=g">Tree Removal</searchlayer>
<searchlayer whereClause="ProjectNumber=h">Tree Removal - Point</searchlayer>
<searchlayer whereClause="ProjectNumber=i">Trimming</searchlayer>
<searchlayer whereClause="ProjectNumber=j">Trimming - Point</searchlayer>
</searchlayers>
</configuration>
是否有可能编写一个Linq语句来获得每个元素(例如除草剂,杂项,再生控制…等)与其匹配的where子句(例如,对于除草剂,where子句将是"ProjectNumber=a")?
我可以分别编写两个语句,一个用于获取元素,一个用于获取属性,但最好只编写一个Linq语句,同时获取两个元素。
谢谢。
这是可能的。但是有许多可能的数据结构可以用来存储2个值对的列表,这里是使用Tuple
的一个例子:
XDocument doc = XDocument.Load("path_to_xml_file.xml");
List<Tuple<string, string>> result =
doc.Root
.Descendants("searchlayer")
.Select(o => Tuple.Create((string) o, (string) o.Attribute("whereClause")))
.ToList();
您可以创建一组匿名对象,如下:
var result = root.Element("searchlayers")
.Elements("searchlayer")
.Select(i =>
new {attribute = i.Attribute("whereClause").Value,
value = i.Value});
这将给出一组记录,其中属性与元素值配对。
如果你想在查询语法中这样做,它看起来像这样:
var result = from el in root.Elements("searchlayers").Elements("searchlayer")
select new {attribute = el.Attribute("whereClause").Value,
value = el.Value};
您可以使用此选项来选择所有与Herbicide
匹配且whereClause与ProjectNumber=a
匹配的元素
IEnumerable<XElement> result =
from el in doc.Elements("Herbicide")
where (string)el.Attribute("whereClause") == "ProjectNumber=a"
select el;
另一个选项是:
var result = doc.Descendants()
.Where(e => e.Attribute("ProjectNumber=a") != null)
.ToList();
它应该提供whereClause
等于"ProjectNumber=a"的所有元素
可以使用Attributes
属性和InnerText
属性一起从XML节点获取属性,如下所示:
XmlDocument doc = new XmlDocument();
doc.LoadXml(yourxml);
XmlNodeList xlist = doc.GetElementsByTagName("searchlayer");
for(int i=0;i<xlist.Count;i++)
{
Console.WriteLine(xlist[i].InnerText + " " + xlist[i].Attributes["whereClause"].Value);
}
如果必须使用LINQ,可以使用XDocument
,然后返回由属性和文本组成的匿名类对象,如下所示:
XDocument xdoc = XDocument.Load(yourxmlfile);
var result = xdoc.Root.Elements("searchlayers").Elements("searchlayers").Select(x => new {attr = x.Attribute("whereClause").Value, txt = x.Value});
foreach (var r in result)
{
Console.WriteLine(r.attr + " " + r.txt);
}