在XML文件崩溃中添加节点

时间:2011-10-27 13:46:17

标签: c# xml

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

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

但我想使用XmlReader& XmlWriter同时崩溃的地方 我将用LINQ to 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");
    }
}

2 个答案:

答案 0 :(得分:2)

您的读者正在阻止写入,因为它位于使用块中。我建议使用Load方法将XmlDocument对象与uri一起使用,而不是创建自己的读者。然后你也可以将初始化与写作操作分开。

答案 1 :(得分:0)

显式关闭XMLReader。

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