Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取特定XML节点元素的最有效方法_C#_Xml_Performance - Fatal编程技术网

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

C# 获取特定XML节点元素的最有效方法,c#,xml,performance,C#,Xml,Performance,每次获取特定父节点的XML节点最有效的方法是什么 让我们假设我有一个包含人名的XML,每个名称节点都有最喜欢的食物节点和最喜欢的饮料节点。 我有一个系统,让用户选择他想要为之获取数据的人,系统按名称查询数据,并在单击按钮后将其显示给用户 因此,在程序开始时,最好将每个人的主XML拆分为XML,然后只在相关人员的XML上运行,或者使用一些if\其他条件使用doc.GetElementsByTagName(“食物”)和doc.GetElementsByTagName(“饮料”) 谢谢 XML示例:

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

让我们假设我有一个包含人名的XML,每个名称节点都有最喜欢的食物节点和最喜欢的饮料节点。 我有一个系统,让用户选择他想要为之获取数据的人,系统按名称查询数据,并在单击按钮后将其显示给用户

因此,在程序开始时,最好将每个人的主XML拆分为XML,然后只在相关人员的XML上运行,或者使用一些if\其他条件使用
doc.GetElementsByTagName(“食物”)
doc.GetElementsByTagName(“饮料”)

谢谢

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>

一种方法是使用
XDocument
解析XML

在这里,我创建了一个自定义函数
GetUserData
。您需要将
username
like
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; }
}
类程序
{
静态void Main(字符串[]参数)
{
XDocument doc=XDocument.Load(@“您的xml路径”);//x.Attribute(“value”).value.ToList(),
DrinkNames=data.Where(x=>x.Name==“FAVE_Drinks”).subjections().Select(x=>x.Attribute(“value”).value.ToList()
};
返回食物数据;
}
}
公共类食品数据
{
公共列表FoodNames{get;set;}
公共列表饮用水名称{get;set;}
}
输出:

编辑:

如果你想把所有的食物和饮料都列在一个清单上(不要把它和食物清单和饮料清单分开)

然后简单地将所有食物数据和饮料数据放入一个列表中,并像下面那样返回该列表

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;
}
公共静态列表GetUserData(XDocument文档,字符串用户名)
{
列表数据=doc.Root.Elements(用户名).Elements().Elements().Select(x=>x.Attribute(“value”).value).ToList();
返回数据;
}
您可以像这样调用上面的方法

List<string> data = GetUserData(doc, "David");
List data=GetUserData(doc,“David”);

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



        }


    }

}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
命名空间控制台应用程序83
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
XDocument doc=XDocument.Load(文件名);
Dictionary dict=doc.Root.Elements()
.GroupBy(x=>x.Name.LocalName,y=>new
{
饮料=y.D(“饮料”)。选择(z=>(字符串)z.Attribute(“值”)).ToList(),
foods=y.foods(“food”).Select(z=>(string)z.Attribute(“value”).ToList()
})
.ToDictionary(x=>x.Key,y=>(object)y.FirstOrDefault());
}
}
}

最有效的方法是将xml树存储在您自己的结构类型中,该结构类型使用字典存储根目录及其子目录。感谢您的回复!!价值是多少。?什么的目标?所有的数据都放进字典里。好主意,谢谢!效率高吗?我的意思是,每个名字检查操作需要多长时间(比如说,我每个人大约有50-60个食物和饮料值)。让我用100个食物和饮料来检查它。我会在5分钟内更新你,检查100种食物和100种饮料,查看
David
,只需2-4毫秒就可以从我这边取回:)我将
GetUserData
方法重写为一个更有效的步骤,即一次收集所有食物数据,然后应用过滤器分别获取食物和饮料名称。plz查看更新的答案:)如果我的答案对您有帮助,请在答案左侧打勾,使其变为绿色:)