正在重写xml文件#2

本文关键字:文件 xml 重写 | 更新日期: 2023-09-27 18:29:57

我试图编辑一个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;
 }

当它执行xmlDoc.Save(路径).时,我得到"进程无法访问文件c:''temp''testfile.xml,因为它正被另一个进程使用"

如何保存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;
}

正在重写xml文件#2

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

您可以尝试使用LinqToXml:进行重写

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;

Stream加载XmlDocument而不是按文件名加载如何?如果您仍然遇到错误,这将表明您的方法/过程之外的某些东西正在阻止保存。

尝试像这样重写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;
 }