对于我正在制作的程序,它是基于这个XML文件构建的,我真的需要一些逻辑方面的帮助。
在进一步讨论之前,xml文件的结构如下所示:
<applications>
<app num="1" desc="changed">
<appname>test</appname>
<version>V 30</version>
<srcpath>c:\</srcpath>
<dstpath>c:\</dstpath>
</app>
<app num="2" desc="changed">
<appname>testing 123</appname>
<version>V 11</version>
<srcpath>C:\Users\testing\src</srcpath>
<dstpath>C:\Users\\testing\dst</dstpath>
</app>
</applications>
考虑到这一点,我正在创建的应用程序基于此xml文件。 我会给你一些关于该计划的背景知识。我有一个带有下拉数据窗口的表单,显示应用程序名称,版本,描述,源路径和目标路径。
用户可以修改这些路径以及与之相关的所有信息 - “num”除外。我希望能够搜索xml文件而无需搜索“appname”或任何可更改的组件(appname,version,desc,srcpath和dstpath都可以更改)
我遇到的问题是当用户选择修改时,会弹出一个新窗口,检索有关路径的信息。单击修改时,此时的逻辑是按appname搜索,然后通过它获取“num”。然而,此方法的问题是appname可能与其他应用程序名称相同,然后一旦找到匹配的appname,它就会继续显示信息。但它可能是错误的信息。如何检索“num”以显示正确的信息?
答案 0 :(得分:1)
如果我理解正确,num
扮演唯一标识符的角色。如果标识符确实是唯一的,我建议使用Dictionary<TKey,TValue>
。
为此,请创建一个代表xml项目的类:
class AppData
{
public int Id { get; set; }
public string Name { get; set;}
// Other properties here
}
启动应用时,从xml:
加载数据public Dictionary<int, AppData> LoadData(string xmlPath)
{
return XDocument.Load(xmlPath)
.Descendants("app")
.Select(e => new AppData
{
Id = Convert.ToInt32(e.Attribute("num").Value),
Name = e.Descendants("appname").Single().Value
})
.ToDictionary(x => x.Id);
}
当用户想要更改特定项目时,请从字典中加载:
var dataItem = dictionary[id];
using(var form = new ChangeItemForm(dataItem))
{
form.ShowDialog();
}
当然,完成后不要忘记将字典数据保存回文件。
答案 1 :(得分:0)
我认为你要获得的是XML文件中的节点,具体取决于属性“num”值... 这可能就是你要找的东西:
XmlDocument doc = new XmlDocument();
doc.Load("filePath");
XmlNodeList nodeList = doc.SelectNodes("//[@num='YOUR_VALUE']");
XmlNode node = nodeList[0];
然后用这个节点做任何你想做的事情
答案 2 :(得分:0)
有工具可以使用xml。 Kerim在C#中建议使用DOM xml,我不建议使用它。
相反,我建议您使用LINQ to XML ... How to work with LINQ to XML
祝你好运更新: RePierre unswer比我的好。我将它留在这里以获取LINQ to XML的链接。