如何基于特定标签名称使用XML和Linq获取元素的值

时间:2019-07-09 18:50:57

标签: c# xml linq

基本上,我已经尝试了所有方法,由于某种原因,我无法根据需要满足的参数来获取XML中元素的值。我觉得我已经接近了,但我不知道我要去哪里错了。我正在尝试获取元素的值并将它们放入列表中,以供其他地方使用。目前,该列表中没有任何内容。

我已经尝试过XML Reader,所以现在我可以尝试使用Linq到XML,但这也不起作用。

private List<string> outputPath = new List<string>();
var doc = XDocument.Load(Path.Combine(projectDirectory, "JobPaths.xml"));
foreach (var child in doc.Element("Jobs").Elements("Job").Where(x => x.Attribute("Name").ToString() == jobName).Elements())
{
    outputPath.Add(child.Name.ToString());
}

return outputPath;

这是XML:

<?xml version="1.0" encoding="utf-8" ?>
<Jobs>
  <Job Name="events_monitoring_c">
    <Path>\\stadb4412\</Path>
  </Job>
  <Job Name="events_monitoring_d">
    <Path>\\stadb4412\</Path>
    <Path>\\stadb1111\</Path>
    <Path>\\stadb2412\</Path>
  </Job>
</Jobs>

jobName来自XML文件,因此我试图基于作业名称获取所有路径元素,无论有多少。我想让列表中的所有路径都可以在其他地方使用。

2 个答案:

答案 0 :(得分:0)

要从XDocument或XElement中查找特定类型/标记的节点,请使用.Descendants(name),然后使用.Attribute(name)返回XAttribute。要获取其值,请使用.Value,而不是.ToString()。

您的代码获取Job元素,但随后将其作为IEnumerable节点获取子元素,并为每个子元素添加标签的名称,始终为Path。

您正在寻找的是doc.Descendants(“ Job”)。Where(job => job.Attribute(“ Name”)?. Value == jobName).SelectMany(job => job.Elements()) .Select(elem => elem.Value).ToList();

我没有编译就这样做了,所以我可能是错的。

答案 1 :(得分:0)

您使用Xml Linq解析为字典:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            Dictionary<string, List<string>> dict = doc.Descendants("Job")
                .GroupBy(x => (string)x.Attribute("Name"), y => y)
                .ToDictionary(x => x.Key, y => y.Elements("Path").Select(z => (string)z).ToList());
        }
    }
}