在XML文件崩溃中添加节点

本文关键字:添加 节点 崩溃 XML 文件 | 更新日期: 2023-09-27 18:12:39

我创建了一个ping应用程序,其中包含一个ping到url的服务。url列表存储在XML文件中。
当我试图在服务运行时向XML添加新站点时,应用程序崩溃了。

VS2010说我的文件正在被其他进程使用,但我确信一切都很好。我的服务在添加时没有使用XML。

但是我猜使用XmlReader &XmlWriter同时也是它崩溃的地方。
我会用LINQ重写我的代码到XML,但我想知道是否有可能使用XmlReader &;同时使用XmlWriter ?

private void saveSites(Site newSite)
{
    XmlDocument XDoc = new XmlDocument();
    bool fileExists = true;
    if (File.Exists("c:''temp''sites.xml") == false)
    {
        createXML();
        fileExists = false;
    }
    using (XmlReader XReader = XmlReader.Create("c:''temp''sites.xml"))
    { 
        XDoc.Load(XReader);
        if (fileExists == true)
        {
            XmlNode SiteNode = XDoc.CreateNode(XmlNodeType.Element, "site", "");
            XmlNode URLNode = XDoc.CreateNode(XmlNodeType.Element, "url", "");
            URLNode.InnerText = newSite.URL;
            XmlNode EmailNode = XDoc.CreateNode(XmlNodeType.Element, "email", "");
            EmailNode.InnerText = newSite.Email;
            SiteNode.AppendChild(URLNode);
            SiteNode.AppendChild(EmailNode);
            XDoc.DocumentElement.AppendChild(SiteNode);
        }
        else
        {
            foreach (Site site in sites)
            {
                XmlNode SiteNode = XDoc.CreateNode(XmlNodeType.Element, "site", "");
                XmlNode URLNode = XDoc.CreateNode(XmlNodeType.Element, "url", "");
                URLNode.InnerText= site.URL;
                XmlNode EmailNode = XDoc.CreateNode(XmlNodeType.Element, "email", "");
                EmailNode.InnerText = site.Email;
                SiteNode.AppendChild(URLNode);
                SiteNode.AppendChild(EmailNode);
                XDoc.DocumentElement.AppendChild(SiteNode);
            }
        }
        XDoc.Save("c:''temp''sites.xml");
    }
}

在XML文件崩溃中添加节点

您的阅读器正在阻塞写入,因为它在using块中。我建议使用带有uri的XmlDocument对象的Load方法,而不是创建您自己的阅读器。然后,您还可以将初始化操作与写入操作分开。

明确地关闭XMLReader。

using (XmlReader reader = XmlReader.Create("file.xml"))
{
  while (reader.Read())
  {
     ...
  }
  reader.Close();
}