как перезагрузить XML-документ - PullRequest
0 голосов
/ 27 февраля 2012

У меня есть 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 голосов
/ 28 февраля 2012

Это довольно запутанный код; Я предполагаю, что 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 голосов
/ 27 февраля 2012

Является ли 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}
      ...

Если нет, приведите более подробный пример с типами, четко определенными для каждой переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...