2014-03-05 95 views
0

对于我所制作的程序来说,它是建立在这个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”。但是这种方法的问题在于应用程序名称可能与其他应用程序名称相同,然后一旦找到匹配的应用程序名称,它就继续显示信息。但它可能是错误的信息。我如何去检索“num”以显示正确的信息?

+0

请说明。你想说:“找到具有这个特定'num'值的实例,或者你想要找到所有的实例,然后获得它们的数量,所以你可以自己检查它吗?当你说“路径”时,你的意思是XPath还是别的? – keshlam

+0

@keshlam当我说路径时,我的意思是在路径中,例如用户输入的路径“c:\ users \ documents”类型,并且我想找到一个实例,其中num与任何当前num相匹配已选择 – user3302467

回答

0

我想你要得到的是从XML文件根据属性“编号”值的节点... 这可能是你在找什么:

XmlDocument doc = new XmlDocument(); 
doc.Load("filePath"); 
XmlNodeList nodeList = doc.SelectNodes("//[@num='YOUR_VALUE']"); 
XmlNode node = nodeList[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(); 
} 

当然,不要忘记保存t他完成后将数据字典回到文件。

+0

为什么要将字典数据保存回文件需要? – user3302467

0

有工具可以使用xml。 Kerim在C#中建议DOM xml,我不推荐使用它。

相反,我建议你使用LINQ到XML ... How to work with LINQ to XML

好运

UPDATE: RePierre unswer比我的好。我将它留在这里以获得LINQ to XML链接。