Самый эффективный способ получить элементы определенных узлов XML - PullRequest
0 голосов
/ 14 ноября 2018

Какой самый эффективный способ получать узлы XML определенного родителя каждый раз?

Давайте предположим, что у меня есть XML, который содержит имена людей, а у каждого узла имени есть узлы любимой еды и любимые напитки 'узел.У меня есть система, которая позволяет пользователю выбирать людей, для которых он хочет получить данные, а система запрашивает их по имени и показывает их пользователю после нажатия кнопки.

Так что лучше разделить основной XMLв xml для каждого человека в начале программы, а затем запустите только на xml соответствующего человека, или, возможно, используйте doc.GetElementsByTagName("food") и doc.GetElementsByTagName("drink"), используя некоторые условия if \ other?

Спасибо !!

Пример XML: пользователь может выбрать «Дэвид» и получить список своих любимых блюд и напитков, затем выбрать Джона ... и т. Д.

<root>
  <David>
    <FAVE_FOOD>
      <food value = "hamburger"/>
      <food value = "banana"/>
    </FAVE_FOOD>
    <FAVE_Drinks>
      <drink value = "water"/>
    </FAVE_Drinks>
  </David>
  <John>
    <FAVE_FOOD>
      <food value = "icecream"/>
    </FAVE_FOOD>
    <FAVE_Drinks>
      <drink value = "7up"/>
    </FAVE_Drinks>
  </John>
etc...
</root>

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Мне нравится использовать xml linq и помещать в словарь, ключом которого являются имена людей

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

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

            Dictionary<string, object> dict = doc.Root.Elements()
                .GroupBy(x => x.Name.LocalName, y => new
                {
                    drinks = y.Descendants("drink").Select(z => (string)z.Attribute("value")).ToList(),
                    foods = y.Descendants("food").Select(z => (string)z.Attribute("value")).ToList()
                })
                .ToDictionary(x => x.Key, y => (object)y.FirstOrDefault());



        }


    }

}
0 голосов
/ 14 ноября 2018

Один из способов - проанализировать ваш XML с помощью XDocument.

Здесь я создал пользовательскую функцию GetUserData. Вам нужно передать username как David этой функции, и тогда эта функция может вернуть вам список названий продуктов и список названий напитков.

Консольное приложение для демонстрационных целей.

class Program
{
    static void Main(string[] args)
    {

        XDocument doc = XDocument.Load(@"Your path to xml");                //<= Load xml

        FoodData foodData = GetUserData(doc, "David");                      //<= Pass "David" to function

        foodData.FoodNames.ForEach(x => Console.WriteLine("Food: " + x));   //<= Print food name list
        Console.WriteLine();
        foodData.DrinkNames.ForEach(x => Console.WriteLine("Drink: " + x)); //<= Print drink name list

        Console.ReadLine();
    }


    public static FoodData GetUserData(XDocument doc, string userName)
    {
        var data = doc.Root.Elements(userName).Elements();

        FoodData foodData = new FoodData
        {
            FoodNames = data.Where(x => x.Name == "FAVE_FOOD").Descendants().Select(x => x.Attribute("value").Value).ToList(),
            DrinkNames = data.Where(x => x.Name == "FAVE_Drinks").Descendants().Select(x => x.Attribute("value").Value).ToList()
        };

        return foodData;
    }
}

public class FoodData
{
    public List<string> FoodNames { get; set; }
    public List<string> DrinkNames { get; set; }
}

Выход:

enter image description here

Edit:

Если вы хотите собрать все продукты питания и напитки в один список (не разделяйте его на список продуктов и список напитков).

Затем просто соберите все данные о еде и напитках в один список и верните этот список как

public static List<string> GetUserData(XDocument doc, string userName)
{
    List<string> data = doc.Root.Elements(userName).Elements().Elements().Select(x => x.Attribute("value").Value).ToList();
    return data;
}

И вы можете вызвать метод выше, как.

List<string> data = GetUserData(doc, "David");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...