C# 获取特定XML节点元素的最有效方法
每次获取特定父节点的XML节点最有效的方法是什么 让我们假设我有一个包含人名的XML,每个名称节点都有最喜欢的食物节点和最喜欢的饮料节点。 我有一个系统,让用户选择他想要为之获取数据的人,系统按名称查询数据,并在单击按钮后将其显示给用户 因此,在程序开始时,最好将每个人的主XML拆分为XML,然后只在相关人员的XML上运行,或者使用一些if\其他条件使用C# 获取特定XML节点元素的最有效方法,c#,xml,performance,C#,Xml,Performance,每次获取特定父节点的XML节点最有效的方法是什么 让我们假设我有一个包含人名的XML,每个名称节点都有最喜欢的食物节点和最喜欢的饮料节点。 我有一个系统,让用户选择他想要为之获取数据的人,系统按名称查询数据,并在单击按钮后将其显示给用户 因此,在程序开始时,最好将每个人的主XML拆分为XML,然后只在相关人员的XML上运行,或者使用一些if\其他条件使用doc.GetElementsByTagName(“食物”)和doc.GetElementsByTagName(“饮料”) 谢谢 XML示例:
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
likeDavid
传递到此函数,然后此函数可以返回食品名称列表和饮料名称列表
用于演示的控制台应用程序
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查看更新的答案:)如果我的答案对您有帮助,请在答案左侧打勾,使其变为绿色:)