使用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);
}
使用docs.Root.Nodes().Remove()
<root />
对于没有内容的标记(自关闭标记)是有效的XML。如果你绝对需要一个开始和结束标签,你需要在根节点放一些内容,比如注释或文本。
混乱是在您的第一句话:"我试图从XML文件中删除所有节点/元素。"是哪一个?要删除所有节点还是所有元素?
XML中有五种类型的节点:元素、文本、注释、处理指令和属性。如果交替使用"node"answers"element",就像这里一样,那么使用XML将会遇到没完没了的麻烦。
您得到的<root/>
是删除所有后代节点的代码的正确输出:它是一个名为root
的单个元素,没有内容。
你想要什么
<root>
</root>
是名为root
的单个元素,它包含包含空格(可能是换行符)的子文本节点。您编写的代码删除了所有后代节点,而不仅仅是后代元素节点,因此它也删除了这个文本节点。