2010-11-22 6 views
2

J'ajoute tracer à des fins d'audit d'un processus simple que j'ai construit en tant que. Exe et mis dans le planificateur à exécuter toutes les 10 minutes. Je veux que l'application produise les résultats dans un fichier xml.comment ajouter un fichier xml dans C#?

Si le fichier existe, ouvrez-y et ajoutez-y des données. S'il n'existe pas, je souhaite créer un nouveau fichier XML qui sera conservé et utilisé lors de la prochaine exécution.

Voici mon code maintenant, que dois-je ajouter, comment puis-je ouvrir le fichier xml (sur c: /file.xml) et l'utiliser pour ajouter des nœuds?

static void Main(string[] args) 
{ 
    XmlDocument doc = new XmlDocument(); 

    XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", null, null); 
    doc.AppendChild(dec);// Create the root element 

    XmlElement root = doc.CreateElement("STATS"); 
    doc.AppendChild(root); 

    XmlElement urlNode = doc.CreateElement("keepalive"); 
    urlNode.SetAttribute("runTime", DateTime.Now.ToString()); 

    try 
    { 
     WebProxy wp = new WebProxy("http://proxy.ml.com:8083/"); 
     WebClient w = new WebClient(); 
     w.Proxy = wp; 

     if (w.DownloadString("http://wwww.example.com") != "") 
      urlNode.SetAttribute("result", "UP"); 
     else 
      urlNode.SetAttribute("result", "DOWN"); 
    } 
    catch 
    { 
     urlNode.SetAttribute("result", "DOWN"); 
    } 
    finally 
    { 
     root.AppendChild(urlNode); 
     doc.Save("c:/keepAlive.xml"); 
    } 
} 
+0

Vous avez déjà la plupart de votre solution - vous créez des nœuds et les enregistrez. Si la façon de lire à partir d'un fichier est vraiment le problème, je vous suggère d'aller voir les surcharges du constructeur pour XmlDocument sur MSDN. – annakata

Répondre

2

Vous ne pouvez pas ajouter un fichier XML - vous devrez charger le fichier dans la mémoire, modifier/ajouter/etc, puis écrire sur le disque.

EDIT:

Eh bien, pour charger un fichier que vous utilisez:

XmlDocument xmlDoc= new XmlDocument(); // create an xml document object. 
if(System.IO.File.Exists("yourXMLFile.xml") 
    xmlDoc.Load("yourXMLFile.xml");// load from file 
else{ 
    // create the structure of your xml document 
    XmlElement root = xmlDoc.CreateElement("STATS"); 
    xmlDoc.AppendChild(root); 
} 

puis commencer à ajouter les choses keepalive.

Je voudrais aller un peu plus loin et ne pas déranger avec xml. Je créerais une classe qui contiendrait tout ce dont j'avais besoin et que je sérialiserais et désérialiserais.

Comme ceci:

[XmlRoot] 
public class Stats{ 
    public Stats(){} 
    public IList<StatsItem> Items{get;set;} 
} 

public class StatsItem{ 
    public StatsItem(){}  

    public string UrlName{get;set;} 
    public DateTime Date{get;set;} 
} 

maintenant juste sérialiser, et vous avez votre document XML. Lorsque le moment est venu, désérialisez-le, ajoutez des éléments à la liste des éléments et effectuez une sérialisation et sauvegardez-le sur le disque.

Il y a beaucoup de ressources sur google, alors cherchez juste un peu pour ça.

+0

puis-je voir un morceau de code qui va charger le fichier dans xmlDoc et ensuite utiliser le reste de mon code pour ajouter des nœuds, mais si le fichier n'existe pas, charger un nouveau doc ​​comme il le fait maintenant. mon problème est maintenant je perds tout l'histoire sur chaque exécution parce qu'il écrase juste le dossier chaque fois et puisqu'il ne charge pas et n'ajoute pas les noeuds je perds toutes les informations historiques. – kacalapy

2
using System; 
using System.Xml.Linq; 
using System.Xml.XPath; 

... 

public void Append(){ 
    XDocument xmldoc = XDocument.Load(@"yourXMLFile.xml")); 
    XElement parentXElement = xmldoc.XPathSelectElement("yourRoot"); 
    XElement newXElement = new XElement("test", "abc"); 

    //append element 
    parentXElement.Add(newXElement); 

    xmldoc.Save(@"yourXMLFile.xml")); 
    } 
+0

+1 pour l'utilisation de XDocument sur XmlDocument. C'est une classe beaucoup plus amicale. – jlafay

Questions connexes