获取特定XML节点元素的最有效方法

时间:2018-11-14 09:18:41

标签: c# xml performance

每次获取特定父级的XML节点的最有效方法是什么?

让我们假设我有一个包含人们姓名的XML,并且每个名称节点都有“喜爱的食物”节点和“喜爱的饮料”节点。 我有一个系统,用户可以选择要为其获取数据的人员,然后按名称查询该系统,并在单击按钮后将其显示给用户。

因此,最好在程序开始时将每个人的主XML拆分为xml,然后仅在相关人的xml上运行,或者使用doc.GetElementsByTagName("food")doc.GetElementsByTagName("drink"),如果\其他条件?

谢谢!

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 :(得分:1)

一种方法是使用XDocument解析XML。

在这里,我创建了一个自定义函数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

编辑:

如果您想将所有食物和饮料归入一个清单(不要将其与食物清单和饮料清单分开)。

然后只需将所有食物数据和饮料数据收集到一个列表中,然后像

那样返回该列表
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");

答案 1 :(得分:1)

我喜欢使用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());



        }


    }

}