【问题标题】:how to reload xml document如何重新加载xml文档
【发布时间】:2012-02-27 13:43:28
【问题描述】:

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

【问题讨论】:

  • 请不要在标题前加上“c#”之类的前缀。这就是标签的用途。
  • xlDoc 已经包含您希望的数据(它用于创建您希望重新加载的确切文件)。无需重新加载。

标签: xml winforms reload


【解决方案1】:

这是一些相当混乱的代码;我假设 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") 搜索所有节点,包括&lt;dependancy .../&gt; 中的节点。

另外,“依赖”是什么意思?你是说“依赖”吗?拼写错误非常非常令人困惑。

【讨论】:

  • 这正是我想要实现的!非常感谢您提供非常详细的答案!
【解决方案2】:

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}
      ...

如果没有,请提供一个更详细的示例,并为每个变量定义明确的类型。

【讨论】:

  • sfile 是实际的 xml 文档。编辑了我的原始帖子以包含此内容。
猜你喜欢
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 2022-08-12
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多