每次获取特定父级的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>
答案 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; }
}
输出:
编辑:
如果您想将所有食物和饮料归入一个清单(不要将其与食物清单和饮料清单分开)。
然后只需将所有食物数据和饮料数据收集到一个列表中,然后像
那样返回该列表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());
}
}
}