如何重新加载xml文档

时间:2012-02-27 13:43:29

标签: xml winforms reload

我有一个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段之前重新加载文件?

2 个答案:

答案 0 :(得分: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}
      ...

如果没有,请提供更详细的示例,其中包含为每个变量定义的类型。

答案 1 :(得分: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 .../>中的节点。

此外,“依赖”是什么意思?你的意思是“依赖”吗?拼写错误非常非常混乱。