2010-11-22 103 views
2

我正在为一个简单的过程添加跟踪,这个过程是作为一个.exe生成的,并在调度程序中设置为每10分钟运行一次。我想让应用程序将结果输出到一个xml文件中。如何在c#中添加一个xml文件?

如果文件存在,然后打开并追加数据,如果它不存在,我想创建一个新的xml文件,它将被保留并在下次运行时使用。

这里是我的代码现在,我需要添加什么,我如何打开xml文件(在c:/file.xml)并使用它来追加节点?

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

您已经拥有了大部分解决方案 - 您正在创建节点将它们添加并保存。如果如何从文件读取是真正的问题,我建议您查看MSDN上的XmlDocument的构造函数重载。 – annakata 2010-11-22 14:53:15

回答

2

您不能附加XML文件 - 您必须在内存中加载文件,修改/添加/ etc,然后将其写入磁盘。

编辑:

好,把文件加载可以使用:

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

,然后开始添加保活的东西。

我真的会走得更远一点,而不是乱七八糟的xml。我会创建一个包含我需要的所有东西的类,然后序列化并反序列化它。

像这样:

[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;} 
} 

现在只是这个序列,你有你的XML文档。到时候,反序列化它,将东西添加到Items列表并序列化并再次保存到磁盘。

谷歌有很多资源,所以只需要搜索一下那些。

+0

我可以看到一个代码块,它会将文件加载到xmlDoc中,然后使用我的代码的其余部分来追加节点,但是如果文件不存在,那么现在加载一个新的文档。我的问题是现在我失去了每次运行的所有历史记录,因为它每次都会覆盖文件,并且由于它不加载和追加节点,我失去了所有的历史信息。 – kacalapy 2010-11-22 15:00:49

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

对于在XmlDocument上使用XDocument +1。这是一个非常友好的课程。 – jlafay 2010-11-22 15:58:42

相关问题