2014-03-05 96 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鏈接。