2012-02-27 76 views
0

我有我用下面的代碼修改xml文件:如何加載XML文檔

XmlDocument xlDoc = new XmlDocument(); 
      string[] files = Directory.GetFiles("C:\\Program Files (x86)", "Product.config", SearchOption.AllDirectories); 
      string sfile = files[0]; 
      xlDoc.Load(sfile); 
      XmlNodeList list = xlDoc.SelectNodes("//dependancy"); 
    XmlNode foundNode = xlDoc.SelectSingleNode("//dependancies//dependancy[@name='Microsoft Windows NT']"); 
int found = list.Count; 

    if (foundNode == null) 
    { 
     foundNode = xmlElement; 
     list[found - 1].AppendChild(foundNode); 
     xlDoc.Save(sfile); 
     ConfigurationManager.RefreshSection(sfile); 
    } 

    foreach (XmlNode node in list) 
    { 
     xlDoc.Load(sfile); 
     try 
     {//use inserted node} 
     ... 

現在執行的foreach之前,我要重新加載XML文檔,因此該值在文件。我遇到的問題是隻有在應用程序重新啓動時纔會加載更改。如何重新加載文件,然後再轉到該foreach段?

+0

請不要用「c#」等來標題。這就是標籤的用途。 – 2012-02-27 14:07:51

+0

xlDoc已包含您希望的數據(它用於創建您希望重新加載的確切文件)。沒有必要重新加載。 – 2012-02-27 20:47:17

回答

0

這是一些很混亂的代碼;我假設xmlElement是您在別處創建的<dependancy name='Microsoft Windows NT'/>元素。

//在XPath表達式中搜索所有元素,因此//dependancies//dependancy[@name='Microsoft Windows NT']//dependancy[@name='Microsoft Windows NT']相同。假設是已經存在至少一個<dependancy .../>元素,然後

list[found - 1].AppendChild(foundNode); 

將插入您的xmlElement作爲最後一個現有<dependancy .../>元素中的兒童;像這樣:

<dependancies> 
    <dependancy> 
     <dependancy name="Microsoft Windows NT" /> 
    </dependancy> 
</dependancies> 

這一定是你的,否則list[found - 1]會崩潰。

我遇到的問題是隻有在應用程序重新啓動時纔會加載更改。

這是不正確的。您已在list[found - 1]中進行更改。真正的問題是,是不是你搜索的內容:

foreach (XmlNode node in list) 

,搜索的list所有的孩子,而不是list[found - 1]孩子。我猜測,你想要的是:

<dependancies> 
    <dependancy /> 
    <dependancy name="Microsoft Windows NT" /> 
</dependancies> 

要獲取,替換XmlNodeList list = xlDoc.SelectNodes("//dependancy");有:

XmlNode dependancies = xlDoc.SelectSingleNode("//dependancies"); 

替換list[found - 1].AppendChild(foundNode)有:

dependancies.AppendChild(foundNode) 

而且foreach (XmlNode node in list)有:

foreach (XmlNode in dependancies.ChildNodes) 

如果這不是你想要的,請澄清。

當您再次運行程序時得到新的xmlElement的原因是因爲xlDoc.SelectNodes("//dependancy")搜索所有節點,包括<dependancy .../>中的節點。

另外,「依賴」是什麼意思?你的意思是「依賴」嗎?拼寫錯誤非常非常混亂。

+0

這正是我想要實現的!非常感謝你的非常詳細的答案! – p0enkie 2012-02-28 04:53:20

0

sfile是Stream類型的對象嗎?如果是這樣,你可能需要刷新您的流,然後該流的位置重置爲0。

if (foundNode == null) 
    { 
     foundNode = xmlElement; 
     list[found - 1].AppendChild(foundNode); 
     xlDoc.Save(sfile); 
     ConfigurationManager.RefreshSection(sfile); 
    } 

    // Reset position of stream 
    sfile.Flush(); 
    sfile.Position = 0; 

    foreach (XmlNode node in list) 
    { 
     xlDoc.Load(sfile); 
     try 
     {//use inserted node} 
     ... 

如果沒有,請提供每個變量以及自定義類型更詳細的例子。

+0

sfile是實際的xml文檔。編輯我的原始帖子,包括這一點。 – p0enkie 2012-02-27 14:22:04