Jimdigriz76 Ответов: 3

Как я могу прочитать три разных значения в XML


Здравствуйте, у меня есть следующий xml-файл:

<Directorys>
  <DIR>
    <name>Installation Path</name>
    <path>C:\Users\briganti\Documents\Lavoro\PIPPO</path>
  </DIR>
  <DIR>
    <name>Temp directory</name>
    <path>C:\Users\briganti\Documents\Lavoro\PLUTO</path>
  </DIR>
  <DIR>
    <name>Test List Path</name>
    <path>C:\Users\briganti\Documents\Lavoro\PAPERINO</path>
  </DIR>
</Directorys>


и я хочу прочитать и сохранить три значения пути в трех разных строковых переменных, используя язык C#. Я использовал следующий код, и он работает, но можно ли сделать то же самое более просто?

Что я уже пробовал:

XmlDocument doc = new XmlDocument();
            doc.Load(Directory.GetCurrentDirectory() + @"\programconfig.xml");
            XmlNodeList paths = doc.DocumentElement.SelectNodes("/Directorys/DIR/path");
            var myList = new List<string>();
            foreach (XmlNode path in paths)
            {
                // Create list
                myList.Add(path.InnerText);
                //MessageBox.Show(path.InnerText);

            }
            // Convert to array
            var myArray = myList.ToArray();
            t_Installazione.Text = myArray[0];
            t_Temp.Text = myArray[1];
            t_testlist.Text = myArray[2];

CHill60

Вам нужно показать нам код, который вы пробовали, и рассказать, в чем проблема

3 Ответов

Рейтинг:
2

Richard Deeming

Возможно, вы захотите рассмотреть, что произойдет, если DIR элементы не находятся в ожидаемом порядке, или какой-либо из путей отсутствует.

string filePath = Path.GetFullPath(@".\programconfig.xml");
XElement doc = XElement.Load(filePath);

Dictionary<string, string> paths = doc.Descendants("DIR").ToDictionary(
    d => (string)d.Element("name"), 
    d => (string)d.Element("path"), 
    StringComparer.OrdinalIgnoreCase);

string value;
if (paths.TryGetValue("Installation Path", out value))
{
    t_Installazione.Text = value;
}
if (paths.TryGetValue("Temp directory", out value))
{
    t_Temp.Text = value;
}
if (paths.TryGetValue("Test List Path", out value))
{
    t_testlist.Text = value;
}


Рейтинг:
1

RickZeeland

Вы также можете использовать XElement, что немного легче, чем использование XmlDocument:

//using System.Linq;
//using System.Xml.Linq;

XElement x = XElement.Load("programconfig.xml");

foreach (var item in x.Elements())
{
    Debug.Print(item.Element("path").Value.ToString());
}


Рейтинг:
0

Garth J Lancaster

Я чувствую себя великодушным - должно быть, это ИСО/алкоголь ... это может начать вас заводить

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);

foreach(XmlNode row in doc.SelectNodes("//DIR"))
{
   string rowName = row.SelectSingleNode("//path").InnerText;
   Console.WriteLine("{0}", rowName);
}


Другой подход может заключаться в десериализации XML в список объектов, например с атрибутами name &path Преобразование XML в объект C# [^]