2012-03-09 63 views
0

删除的XDocument节点希望这将是一个容易的人来解决。通过ID

我使用下面的代码删除XML节点。

XDocument XD = XDocument.Parse(content); 
    XD.Root.Descendants("{http://www.w3.org/2000/svg}rect").Remove(); 

这工作得很好,但我现在想要做一个地方的RECT子句以“BPR”的ID只删除节点。我见过几个例子,其中包括。但是,这似乎并不想用我的代码。

任何人都可以帮忙吗?

感谢

+2

“这似乎并不想与之合作我的代码“ - 这不是对错误发生的非常准确的描述。请提供一个简短但完整的示例,其中包含示例输入XML文件和预期输出以及代码。 – 2012-03-09 12:48:59

+0

嗨乔恩,对不起,我应该说。它正在标记。在VS2010中,因为我没有包含使用System.Linq的引用;但是现在我在使用Foo42的例子时遇到了一个错误。内。载的代码标记了错误信息 - “不能转换lambda表达式类型System.Xml.Linq.XAttribute,因为它不是一个委托类型” – tmutton 2012-03-09 14:39:34

+0

人士建议更改Foo42的回答,以及提供我自己的更简单(IMO)一个。 – 2012-03-09 14:46:16

回答

2

一个简单的替代方法(IMO)于Foo42的回答是:

XDocument XD = XDocument.Parse(content); 
XD.Root.Descendants("{http://www.w3.org/2000/svg}rect") 
     .Where(el => (string) el.Attribute("id") == "bpr") 
     .Remove(); 
+0

那伟大的工作。谢谢! – tmutton 2012-03-09 14:55:26

1
XDocument XD = XDocument.Parse(content); 
    XD.Root.Descendants("{http://www.w3.org/2000/svg}rect").Where(el => el.Attributes().Contains(at => at.Name == "id" && at.Value == "bpr")).Remove(); 

我觉得这样的事情应该工作

+0

谢谢你的帮助。我试图测试它,但在VS2010中出现错误。它强调“在=> at.Name ==‘ID’&& at.Value ==‘BPR’”与错误消息 - “不能转换lambda表达式键入System.Xml.Linq.XAttribute,因为它不是委托键入” – tmutton 2012-03-09 14:37:32

+0

我想你想'Any',而不是'Contains' – 2012-03-09 14:44:57