2010-11-04 7 views
0

Je suis en train de développer un add-on pour Excel en C# qui inclut un serveur RTD. Comme nous n'avons pas encore de base de données SQL, je dois utiliser un fichier XML pour stocker les données.Écrire et lire le même fichier xml avec C# (serveur RTD pour Excel)

Le fichier XML est mis à jour via une fonction C# utilisée dans Excel d'un côté. D'un autre côté, plusieurs utilisateurs doivent être en mesure de récupérer ces données en temps réel.

Lorsque j'exécute les deux fonctions (mettre à jour et lire le fichier XML), la fonction d'écriture se bloque de temps en temps avec l'erreur file being usee by another process.

La fonction d'écriture:

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); 

et fonction de lecture:

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

Je ne peux pas voir comment démerder, de sorte que toute idée sera plus que bienvenue.

Répondre

0

Vous ne pouvez pas aussi loin que je sache. Définissez une classe qui mappe votre fichier XML (par exemple public class Ticker). Instancier un objet de cette classe lorsque vous mettez à jour le fichier xml:

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

et accéder aux nouvelles données par cet objet:

topic.Value = this.ticker.tickerValue; 

Remarque: Vous pouvez utiliser modèle d'observation pour vous Ticker classe et mise à jour quand vous mettez à jour le fichier xml.

1

Je viens de trouver une réponse facile:

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

De cette façon, à la fois lire et écrire des fonctions, rien ne s'écrase tout.