搜索xml

时间:2014-03-05 13:34:19

标签: c# xml

对于我正在制作的程序,它是基于这个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”以显示正确的信息?

3 个答案:

答案 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的链接。