2012-02-27 74 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