Как получить значение элементов с использованием XML и Linq на основе определенного имени тега - PullRequest
0 голосов
/ 09 июля 2019

По сути, я перепробовал все, и по какой-то причине я не могу получить значение элементов в моем 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 голосов
/ 10 июля 2019

Вы разбираете в словарь, используя 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());
        }
    }
}
0 голосов
/ 09 июля 2019

Чтобы найти узлы определенного типа / тега из XDocument или XElement, который вы используете .Descendants (имя), тогда у вас есть .Attribute (имя), который возвращает XAttribute. Чтобы получить его значение, вы используете .Value, а не .ToString ().

Ваш код получает элементы Job, но затем он получает дочерние элементы в виде IEnumerable узлов и для каждого из них добавляет Имя тегов, которое всегда равно Path.

То, что вы ищете, это doc.Descendants ("Job"). Где (job => job.Attribute ("Name") ?. Value == jobName) .SelectMany (job => job.Elements ()) .Select (эль => elem.Value) .ToList ();

Я сделал это без компиляции, поэтому я могу ошибаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...