我正在尝试从XML文件中删除所有节点。但它也删除了根节点打开标记。使用C#anf 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();
}
CODE:
下面是我正在使用的代码,概念是错误计数和时间戳记录到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);
}
答案 0 :(得分:1)
使用docs.Root.Nodes().Remove()
。
答案 1 :(得分:1)
<root />
是没有内容的标记的有效XML(自动关闭标记)。如果您绝对需要开始和结束标记,则需要在根节点中放置一些内容,如注释或文本。
答案 2 :(得分:1)
混淆在你的第一句话中:“我正在尝试从XML文件中删除所有节点/元素。”哪一个?是否要删除所有节点或所有元素?
XML中有五种类型的节点:元素,文本,注释,处理指令和属性。如果您可以互换使用“node”和“element”,就像在这里一样,您将无需使用XML。
你得到的是<root/>
,是删除所有后代节点的代码的正确输出:它是一个名为root
但没有内容的单个元素。
您的期望,
<root>
</root>
是一个名为root
的单个元素,它包含一个包含空格的子文本节点,可能是换行符。您编写的代码将删除所有后代节点,而不仅仅是后代元素节点,因此它也删除了此文本节点。