簡體   English   中英

如何基於特定標簽名稱使用XML和Linq獲取元素的值

[英]How to get the value of elements using XML and Linq based off a specific tag name

本質上,我已經嘗試了所有方法,由於某種原因,我無法根據需要滿足的參數來獲取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文件,因此我試圖基於作業名稱獲取所有路徑元素,無論有多少。 我想獲取列表中的所有路徑以在其他地方使用。

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

我沒有編譯就這樣做了,所以我可能是錯的。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM