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

时间:2011-11-21 18:01:20

标签: c# linq-to-xml

我正在尝试从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);
}

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

混淆在你的第一句话中:“我正在尝试从XML文件中删除所有节点/元素。”哪一个?是否要删除所有节点或所有元素?

XML中有五种类型的节点:元素,文本,注释,处理指令和属性。如果您可以互换使用“node”和“element”,就像在这里一样,您将无需使用XML。

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

您的期望,

<root>
</root>

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