【问题标题】:Close XDocument instance关闭 XDocument 实例
【发布时间】:2014-06-23 00:41:06
【问题描述】:

我一直在对此进行一些研究,但仍然无法解决。我有这个功能:

private void AddNewService()
{
    string strPath = "ServicesToExecute.xml";
    string strServicename = tbNewService.Text;
    //try
    //{
        XDocument xdDocument;
        using (XmlReader xmlReader = XmlReader.Create(strPath))
        {
            xdDocument = XDocument.Load(xmlReader); 

            XElement root = new XElement("Service");
            root.Add(new XElement("Name", strServicename));
            xdDocument.Element("ServicesToExecute").Add(root);
            xmlReader.Close();
            xdDocument.Save(strPath);      
        }

我在尝试保存文件时遇到错误...知道吗?我想我错过了一些非常非常愚蠢但现在看不到的东西。

【问题讨论】:

  • 收到错误时抛出什么异常?
  • 为什么不使用带路径的XDocument.Load 重载,而不是自己创建XmlReader 并关闭它?
  • 异常是“System.xml.dll 中发生 System.IO.IOException 类型的未处理异常”进程无法访问文件 blablabla.xml,因为它正被另一个进程使用...

标签: c# xml linq-to-xml xmlreader


【解决方案1】:

我相信您在XmlReader 中打开了一个名为ServicesToExecute.xml 的文件,然后尝试将XDocument 保存在同一路径中……也就是试图覆盖您已打开以供阅读的文件。根据上面的@mikez,您可能应该通过使用XDocument.Load(string path) 重载来简化代码:

private void AddNewService()
{
    string strPath = "ServicesToExecute.xml";
    string strServicename = tbNewService.Text;
    //try
    //{
        XDocument xdDocument = XDocument.Load(strPath);

        XElement root = new XElement("Service");
        root.Add(new XElement("Name", strServicename));
        xdDocument.Element("ServicesToExecute").Add(root);

        // Save
        xdDocument.Save(strPath);

【讨论】:

  • 对不起.. 将 save 语句从 using 中移出,也没有移动 close ......嗯......仍在研究和尝试事情......
  • 保存到不同的路径/文件名,或者去掉XmlReader的使用(见我更新的答案)。
  • 不..对不起..相同的答案...它曾经工作过..后来相同..顺便说一句..我需要更新同一个文件...只要我是在那里检查我的服务并重新加载一个组合框
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
  • 2016-05-05
  • 2015-01-31
  • 2015-09-07
相关资源
最近更新 更多