如何用一个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语句,同时获取两个元素。

谢谢。

如何用一个Linq查询获得XML属性和元素

这是可能的。但是有许多可能的数据结构可以用来存储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);
 }