覆盖xml文件#2

时间:2012-04-02 18:21:13

标签: c# xml

我正在尝试编辑xml,然后使用相同的名称保存它。

我有以下代码:

public int ModifyFile(string xmlpath, string option, int returnCode)
{
   XmlDocument xmlDoc = new XmlDocument();
   xmlDoc.Load(xmlpath);
   XmlNode parentNode = xmlDoc.DocumentElement;
   if (option.Equals("delete"))
      {
          returnCode = DeleteTag(parentNode, "identity", returnCode);
      }

      xmlDoc.Save(xmlpath);

      return returnCode;
 }


 public int DeleteTag(XmlNode root, string deleteName, int returnCode)
 {
     foreach (XmlNode node in root.ChildNodes)
     {
         if (node.Name == deleteName)
         {
             root.RemoveChild(node);
             returnCode = 1;
         }
         else
         {
             returnCode = DeleteTag(node, deleteName, returnCode);
         }
     }
     return returnCode;
 }

我收到“进程无法访问文件'c:\ temp \ testfile.xml',因为它正在被另一个进程使用”当它执行xmlDoc.Save(path)时。

如何使用所做的更改保存testfile.xml?我需要保持路径和名称相同。

public static bool hasIdentityTag(string path)
{
    bool isTextPresent = false;
    if (File.Exists(path))
    {
        XmlTextReader rdrXml = new XmlTextReader(path);

        do
        {
            switch (rdrXml.NodeType)
            {
                case XmlNodeType.Element:
                    if (rdrXml.Name.Equals("identity"))
                    {
                        isTextPresent = true;
                        rdrXml.Close();
                    }
                    break;
            }
        } while (rdrXml.Read());
    }
    else
    {
        Console.WriteLine("The file {0} could not be located", path);
    }

    return isTextPresent;
}

3 个答案:

答案 0 :(得分:0)

一种选择是将新XML保存到临时文件,关闭XmlDocument并处置该对象,然后将临时文件移回正确的位置。

答案 1 :(得分:0)

您可以使用Linq To Xml尝试此重写:

XElement root = XElement.Load(xmlpath);
bool modified = false;
try
{
    switch(option)
    {
        case "delete":
            var toDelete = root.Descendants("identity").ToArray();
            foreach(XElement x in toDelete)
            {
                x.Remove();
                modified = true;
                returnCode = 1;
            }
            break;
    }
}
finally
{
    if(modified)
        root.Save(xmlpath);
}
return returnCode;

答案 2 :(得分:-1)

如何从XmlDocument而不是按文件名加载Stream?如果您仍然遇到错误,则表示您的方法/流程之外的某些内容阻止了保存。

尝试重写ModifyFile方法,如下所示:

public int ModifyFile(string xmlpath, string option, int returnCode)
{
   var fs = File.Open(xmlpath);

   XmlDocument xmlDoc = new XmlDocument();
   xmlDoc.Load(fs);  // use the stream, not file name
   fs.Close(); // now close the stream... file should not be locked from this point 

   XmlNode parentNode = xmlDoc.DocumentElement;
   if (option.Equals("delete"))
      {
          returnCode = DeleteTag(parentNode, "identity", returnCode);
      }

      xmlDoc.Save(path);

      return returnCode;
 }