删除innerXML后,如何删除C#中的空标记?

删除innerXML后,如何删除C#中的空标记?,c#,xml,attributes,xmlnode,C#,Xml,Attributes,Xmlnode,当用户在我的DataGrid中选择一行并单击“删除”时,我想从文档中删除节点 我的结果显示,只有内部XML已被删除,但标记仍保留在文档中 有什么想法吗 我也尝试过: n.ParentNode.ChildNodes.Remove(n); 2019年9月4日下午2:21 C:\Users\contract\u lshamoon\Desktop\filedeleter\index-Copy.js C:\Users\contract\u lshamoon\Desktop\filedeleter js

当用户在我的DataGrid中选择一行并单击“删除”时,我想从文档中删除节点

我的结果显示,只有内部XML已被删除,但标记仍保留在文档中

有什么想法吗

我也尝试过:

n.ParentNode.ChildNodes.Remove(n);

2019年9月4日下午2:21
C:\Users\contract\u lshamoon\Desktop\filedeleter\index-Copy.js
C:\Users\contract\u lshamoon\Desktop\filedeleter
js
1.
删除:62个文件。
2019年9月4日下午2:21
C:\Users\contract\u lshamoon\Desktop\filedeleter\index.js
C:\Users\contract\u lshamoon\Desktop\filedeleter
js
1.
删除:55个文件。

您可以尝试
n.ParentNode.RemoveChild(n)而不是
n.RemoveAll()

您不必在XmlNode中移动,而必须在XmlNodeList中移动。下面我在Rextester中测试了您的数据,您可以自己尝试:

//Rextester.Program.Main is the entry point for your code. Don't change it.
//Compiler version 4.0.30319.17929 for Microsoft (R) .NET Framework 4.5

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Xml;

namespace Rextester
{
public class Program
{
    public static void Main(string[] args)
    {
        String str = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" + 
    "<Jobs>\r\n" + 
    "  <Job>\r\n" + 
    "  </Job>\r\n" + 
    "  <Job JobId=\"d7bf1b4e-a452-4417-aa72-2ba23c246fc3\">\r\n" + 
    "    <JobDate>04/09/2019 2:21 PM</JobDate>\r\n" + 
    "    <File>C:\\Users\\contract_lshamoon\\Desktop\\filedeleter\\index - Copy.js</File>\r\n" + 
    "    <FilePath>C:\\Users\\contract_lshamoon\\Desktop\\filedeleter</FilePath>\r\n" + 
    "    <Extension>js</Extension>\r\n" + 
    "    <Age>1</Age>\r\n" + 
    "    <JobComment>Deleted : 62 files.</JobComment>\r\n" + 
    "  </Job>\r\n" + 
    "  <Job JobId=\"997dd4cd-b29f-4de4-ad0f-4d4d72a5fe28\">\r\n" + 
    "    <JobDate>04/09/2019 2:21 PM</JobDate>\r\n" + 
    "    <File>C:\\Users\\contract_lshamoon\\Desktop\\filedeleter\\index.js</File>\r\n" + 
    "    <FilePath>C:\\Users\\contract_lshamoon\\Desktop\\filedeleter</FilePath>\r\n" + 
    "    <Extension>js</Extension>\r\n" + 
    "    <Age>1</Age>\r\n" + 
    "    <JobComment>Deleted : 55 files.</JobComment>\r\n" + 
    "  </Job>\r\n" + 
    "</Jobs>";

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(str);
        XmlNodeList nodes = doc.SelectSingleNode("Jobs").SelectNodes("Job");
        for (int i = nodes.Count - 1; i >= 0; i--)
        {
             if (nodes[i].Attributes["JobId"] == null) //this statement removes null tags
             {
                 nodes[i].ParentNode.RemoveChild(nodes[i]);
             } else if(nodes[i].Attributes["JobId"].Value == "d7bf1b4e-a452-4417-aa72-2ba23c246fc3") //this statement removes selected tag.
                nodes[i].ParentNode.RemoveChild(nodes[i]);
        }        
        Console.WriteLine(doc.OuterXml);
    }
  }
}

谢谢你们的回答。 这是对我有效的解决方案: 它通过从根中删除子节点来工作

private static void DeleteXmlNode(string path, string tagname, string searchVal)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(path);
            XmlNodeList nodes = doc.GetElementsByTagName(tagname);
            XmlNode root = doc.DocumentElement;
            foreach (XmlNode n in root)
            {
                if (n.Attributes["Id"].Value == searchVal)
                {
                    root.RemoveChild(n);
                }
            }
            using (var tw = new StreamWriter(@"~../../../../Log/Log.txt".Trim(), true))
            {
                tw.WriteLine(DateTime.Now + "\t" + WinId + "\t DELETED Job ::: " + searchVal);
            }
            doc.Save(path);
        }

这会起作用,但我需要从文件中读取XML,而不是字符串。在代码中,您只需更改相关部分。顺便说一句,我制作了一个版本来回答你的问题,这样你就可以直接使用它了。谢谢你的帮助!你的例子是可行的,但问题是:我没有像我说的那样从数组中读取文本。我正在从项目中的一个单独的xml文件中读取xml
<?xml version="1.0" encoding="utf-8"?>
<Jobs>
  <Job>
  </Job>
  <Job JobId="d7bf1b4e-a452-4417-aa72-2ba23c246fc3">
    <JobDate>04/09/2019 2:21 PM</JobDate>
    <File>C:\Users\contract_lshamoon\Desktop\filedeleter\index - Copy.js</File>
    <FilePath>C:\Users\contract_lshamoon\Desktop\filedeleter</FilePath>
    <Extension>js</Extension>
    <Age>1</Age>
    <JobComment>Deleted : 62 files.</JobComment>
  </Job>
  <Job JobId="997dd4cd-b29f-4de4-ad0f-4d4d72a5fe28">
    <JobDate>04/09/2019 2:21 PM</JobDate>
    <File>C:\Users\contract_lshamoon\Desktop\filedeleter\index.js</File>
    <FilePath>C:\Users\contract_lshamoon\Desktop\filedeleter</FilePath>
    <Extension>js</Extension>
    <Age>1</Age>
    <JobComment>Deleted : 55 files.</JobComment>
  </Job>
</Jobs>
//Rextester.Program.Main is the entry point for your code. Don't change it.
//Compiler version 4.0.30319.17929 for Microsoft (R) .NET Framework 4.5

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Xml;

namespace Rextester
{
public class Program
{
    public static void Main(string[] args)
    {
        String str = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" + 
    "<Jobs>\r\n" + 
    "  <Job>\r\n" + 
    "  </Job>\r\n" + 
    "  <Job JobId=\"d7bf1b4e-a452-4417-aa72-2ba23c246fc3\">\r\n" + 
    "    <JobDate>04/09/2019 2:21 PM</JobDate>\r\n" + 
    "    <File>C:\\Users\\contract_lshamoon\\Desktop\\filedeleter\\index - Copy.js</File>\r\n" + 
    "    <FilePath>C:\\Users\\contract_lshamoon\\Desktop\\filedeleter</FilePath>\r\n" + 
    "    <Extension>js</Extension>\r\n" + 
    "    <Age>1</Age>\r\n" + 
    "    <JobComment>Deleted : 62 files.</JobComment>\r\n" + 
    "  </Job>\r\n" + 
    "  <Job JobId=\"997dd4cd-b29f-4de4-ad0f-4d4d72a5fe28\">\r\n" + 
    "    <JobDate>04/09/2019 2:21 PM</JobDate>\r\n" + 
    "    <File>C:\\Users\\contract_lshamoon\\Desktop\\filedeleter\\index.js</File>\r\n" + 
    "    <FilePath>C:\\Users\\contract_lshamoon\\Desktop\\filedeleter</FilePath>\r\n" + 
    "    <Extension>js</Extension>\r\n" + 
    "    <Age>1</Age>\r\n" + 
    "    <JobComment>Deleted : 55 files.</JobComment>\r\n" + 
    "  </Job>\r\n" + 
    "</Jobs>";

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(str);
        XmlNodeList nodes = doc.SelectSingleNode("Jobs").SelectNodes("Job");
        for (int i = nodes.Count - 1; i >= 0; i--)
        {
             if (nodes[i].Attributes["JobId"] == null) //this statement removes null tags
             {
                 nodes[i].ParentNode.RemoveChild(nodes[i]);
             } else if(nodes[i].Attributes["JobId"].Value == "d7bf1b4e-a452-4417-aa72-2ba23c246fc3") //this statement removes selected tag.
                nodes[i].ParentNode.RemoveChild(nodes[i]);
        }        
        Console.WriteLine(doc.OuterXml);
    }
  }
}
private static void DeleteXmlNode(string path, string tagname, string searchconditionAttributevalue)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(path);
    XmlNodeList nodes = doc.GetElementsByTagName(tagname);
    AddFileSecurity(path, FileSystemRights.ReadData, AccessControlType.Allow);

    XmlNodeList nodes = doc.SelectSingleNode("Jobs").SelectNodes("Job");
    for (int i = nodes.Count - 1; i >= 0; i--)
    {
         if (nodes[i].Attributes["JobId"] == null) //this statement removes null tags
         {
             nodes[i].ParentNode.RemoveChild(nodes[i]);
         } else if(nodes[i].Attributes["JobId"].Value == searchconditionAttributevalue) //this statement removes selected tag.
            nodes[i].ParentNode.RemoveChild(nodes[i]);
    }   

    doc.Save(path);
}
private static void DeleteXmlNode(string path, string tagname, string searchVal)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(path);
            XmlNodeList nodes = doc.GetElementsByTagName(tagname);
            XmlNode root = doc.DocumentElement;
            foreach (XmlNode n in root)
            {
                if (n.Attributes["Id"].Value == searchVal)
                {
                    root.RemoveChild(n);
                }
            }
            using (var tw = new StreamWriter(@"~../../../../Log/Log.txt".Trim(), true))
            {
                tw.WriteLine(DateTime.Now + "\t" + WinId + "\t DELETED Job ::: " + searchVal);
            }
            doc.Save(path);
        }