gpt4 book ai didi

c# - 如何按属性选择 XML 节点并使用它的子节点数据?

转载 作者:太空宇宙 更新时间:2023-11-03 14:20:20 27 4
gpt4 key购买 nike

这是我的 XML 文件

<?xml version="1.0" encoding="utf-8" ?> 
<storage>
<Save Name ="Lifeline">
<Seconds>12</Seconds>
<Minutes>24</Minutes>
<Hours>9</Hours>
<Days>25</Days>
<Months>8</Months>
<Years>2010</Years>
<Health>90</Health>
<Mood>100</Mood>
</Save>

<Save Name ="Hellcode">
<Seconds>24</Seconds>
<Minutes>48</Minutes>
<Hours>18</Hours>
<Days>15</Days>
<Months>4</Months>
<Years>1995</Years>
<Health>50</Health>
<Mood>50</Mood>
</Save>

这是一个从 XML 获取数据并将其加载到应用程序中的代码。

System.IO.StreamReader sr = new System.IO.StreamReader(@"Saves.xml");

System.Xml.XmlTextReader xr = new System.Xml.XmlTextReader(sr);

System.Xml.XmlDocument save = new System.Xml.XmlDocument();

save.Load(xr);


XmlNodeList saveItems = save.SelectNodes("Storage/Save");

XmlNode seconds = saveItems.Item(0).SelectSingleNode("Seconds");
sec = Int32.Parse(seconds.InnerText);

XmlNode minutes = saveItems.Item(0).SelectSingleNode("Minutes");
min = Int32.Parse(minutes.InnerText);

XmlNode hours = saveItems.Item(0).SelectSingleNode("Hours");
hour = Int32.Parse(hours.InnerText);

XmlNode days = saveItems.Item(0).SelectSingleNode("Days");
day = Int32.Parse(days.InnerText);

XmlNode months = saveItems.Item(0).SelectSingleNode("Months");
month = Int32.Parse(months.InnerText);

XmlNode years = saveItems.Item(0).SelectSingleNode("Years");
year = Int32.Parse(years.InnerText);

XmlNode health_ = saveItems.Item(0).SelectSingleNode("Health");
health = Int32.Parse(health_.InnerText);

XmlNode mood_ = saveItems.Item(0).SelectSingleNode("Mood");
mood = Int32.Parse(mood_.InnerText);

问题在于此代码仅从“生命线”节点加载数据。我想使用列表框并能够选择从哪个节点加载数据。

我尝试从列表框项目内容中获取字符串,然后使用这样一行

XmlNodeList saveItems = save.SelectNodes(string.Format("storage/Save[@Name = '{0}']", name)); 

变量“名称”是来自列表框项目的字符串。编译此代码时会出现异常。有人知道如何按属性选择并从该 XML 加载所需数据的方法吗?

最佳答案

如果可以使用 XElement:

XElement xml = XElement.Load(file);
XElement storage = xml.Element("storage");
XElement save = storage.Elements("Save").FirstOrDefault(e => ((string)e.Attribute("Name")) == nameWeWant);
if(null != save)
{
// do something with it
}

我个人喜欢那些具有与 XElement 相互转换的属性的类,以便在主程序中隐藏该细节。 IE 表示 Save 类在构造函数中获取一个 XElement 节点,将其全局保存在内部,并对其进行读/写属性。

示例类:

  public class MyClass
{
XElement self;
public MyClass(XElement self)
{
this.self = self;
}

public string Name
{
get { return (string)(self.Attribute("Name") ?? "some default value/null"); }
set
{
XAttribute x = source.Attribute("Name");
if(null == x)
source.Add(new XAttribute("Name", value));
else
x.ReplaceWith(new XAttribute("Name", value));
}
}
}

然后您可以将搜索更改为:

XElement save = storage.Elements("Save")
.FirstOrDefault(e => new MyClass(e).Name == NameWeWant);

关于c# - 如何按属性选择 XML 节点并使用它的子节点数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5607116/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com