Написать и прочитать тот же XML-файл с C # (RTD-сервер для Excel) - PullRequest
0 голосов
/ 05 ноября 2010

Я разрабатываю надстройку для Excel на C #, которая включает в себя RTD-сервер. Поскольку у нас еще нет базы данных SQL, я должен использовать файл XML для хранения данных.

Файл XML обновляется с помощью функции C #, используемой в Excel с одной стороны. С другой стороны, несколько пользователей должны иметь возможность получать эти данные в режиме реального времени.

Когда я запускаю обе функции (обновить и прочитать файл XML), функция записи время от времени вылетает с ошибкой file being usee by another process.

Функция записи:

string _dataPath = Path.Combine(xllDir, "Test.xml");

        XmlDocument xmlDoc = new XmlDocument();

        xmlDoc.Load(_dataPath);

        XmlNode node = xmlDoc.SelectSingleNode(Data_Type.ToUpper() + "/" + Ticker.ToUpper() + "/" + Data.ToUpper() + "/VALUE");

        node.InnerXml = Convert.ToString(Value);

        XmlNode node_update = xmlDoc.SelectSingleNode(Data_Type.ToUpper() + "/" + Ticker.ToUpper() + "/" + Data.ToUpper() + "/LAST_UPDATE");
        node_update.InnerXml = Convert.ToString((DateTime.Now).TimeOfDay);

        xmlDoc.Save(_dataPath);

и функция чтения:

 _xml.Load(topic.FileName);
        XmlNode node = _xml.SelectSingleNode("//" + topic.Ticker);
        topic.Value = node.InnerText;

Я не вижу, как с этим разобраться, поэтому любая идея будет более чем приветствоваться.

Ответы [ 2 ]

1 голос
/ 05 ноября 2010

Я только что нашел простой ответ:

FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
         _xml.Load(fs);
         fs.Close();
         XmlNode node = _xml.SelectSingleNode("//" + Ticker);
         return node.InnerText;

Таким образом, для функций чтения и записи ничего не происходит вообще.

0 голосов
/ 05 ноября 2010

Вы не можете, насколько я знаю.Определите класс, который отображает ваш XML-файл (например, public class Ticker).Создайте объект этого класса при обновлении XML-файла:

node_update.InnerXml = Convert.ToString((DateTime.Now).TimeOfDay);
var ticker = new Ticker();
ticker.tickerValue = node_update.InnerText;

и получите доступ к новым данным через этот объект:

topic.Value = this.ticker.tickerValue;  

Примечание. Вы можете использовать шаблон наблюдателя для себяОтметьте класс и обновляйте его всякий раз, когда вы обновляете XML-файл.

...