使用LINQ从XML文件中删除所有节点时出现问题

本文关键字:节点 问题 删除 LINQ XML 文件 使用 | 更新日期: 2023-09-27 18:15:16

我试图从XML文件中删除所有节点。但它也删除了根节点打开标签。使用c#和Linq

输入:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--Log the error count and error message-->
<root>
    <ErrData>
        <Count>1</Count>
        <Timestamp>2011-11-21T11:57:12.3539044-05:00</Timestamp>
     </ErrData>
     <ErrData>max of 20 ErrData elements</ErrData>
 </root>
预期OP

:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--Log the error count and error message-->
<root>
</root>

实际OP: 编辑

<?xml version="1.0" encoding="utf-8" standalone="no"?>
    <!--Log the error count and error message-->
<root />
代码:

XDocument docs = XDocument.Load(path);
try
{                   
    docs.Descendants("ErrData").Remove();
}
代码:

下面是我使用的代码,概念是错误计数和时间戳被记录到XML文件中。一旦达到阈值,电子邮件将通过函数发送,并从xml中删除所有节点。然后,当出现下一个错误时,它将开始进入xml文件,如下所示,

XDocument doc = null;
XElement el;
if (!System.IO.File.Exists(path))
{
    doc = new XDocument(new XDeclaration("1.0", "utf-8", "no"));
    el = new XElement("root");
    //el = new XElement("root");
    XComment comment = new XComment("Log the error count and error message");
    doc.Add(comment);
}
else
{
    doc = XDocument.Load(path);
}
XElement p1 = new XElement("ErrData");
XElement p1Count = new XElement("Count", eventCount);
XElement p1Windowsatrt = new XElement("Timestamp", windowStart);
p1.Add(p1Count );
p1.Add(p1Windowsatrt );
if (doc.Root != null)
{
    el = doc.Root;
    el.Add(p1);
}
else
{
    el = new XElement("root");
    el.Add(p1);
}

try
{
    doc.Add(el);//Line throwing the exeception
}
catch (Exception e)
{
}
finally
{
    doc.Save(path);
}

使用LINQ从XML文件中删除所有节点时出现问题

使用docs.Root.Nodes().Remove()

<root />对于没有内容的标记(自关闭标记)是有效的XML。如果你绝对需要一个开始和结束标签,你需要在根节点放一些内容,比如注释或文本。

混乱是在您的第一句话:"我试图从XML文件中删除所有节点/元素。"是哪一个?要删除所有节点还是所有元素?

XML中有五种类型的节点:元素、文本、注释、处理指令和属性。如果交替使用"node"answers"element",就像这里一样,那么使用XML将会遇到没完没了的麻烦。

您得到的<root/>是删除所有后代节点的代码的正确输出:它是一个名为root的单个元素,没有内容。

你想要什么

<root>
</root>

是名为root的单个元素,它包含包含空格(可能是换行符)的子文本节点。您编写的代码删除了所有后代节点,而不仅仅是后代元素节点,因此它也删除了这个文本节点。