2011-11-21 87 views
4

我想从XML文件中删除所有节点。但其移除根节点开放标签也。采用C#ANF的LINQ从XML文件中删除所有节点的问题usig 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:EDITED

<?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 file.Once其达到阈值,邮件将被发送功能,并删除所有来自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); 
} 
+1

你确定缺少开标签吗?它不只是缩写为? – neeKo

+0

它是我的错,它是缩写的根标记。但问题是,下次使用相同的文件来编写错误时,它会抛出“此操作会创建错误结构的文档”。我从这个错误开始,但忽略了收尾和标签。 – Vani

+0

你可以发布试图插入新的'ErrData'元素的代码(你得到异常的地方)吗? –

回答

1

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

1

<root />对于没有内容(自闭标签)的标签是有效的XML。如果您绝对需要开放标签和结束标签,则需要将一些内容放入根节点中,如评论或文本。

1

混淆在你的第一句话中:“我试图从XML文件中删除所有节点/元素。”哪一个?你想删除所有节点,还是全部元素?

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

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

你有什么期望,

<root> 
</root> 

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

+0

我会花更多时间深入学习LINQ概念。谢谢。 – Vani

+0

这些是XML概念,而不是LINQ概念。如果您使用'XmlDocument'方法来执行此操作,则会遇到同样的问题。 –