在.NET中过滤XML文档中元素的最简单方法

假设我有以下文档

  set1 80  Val R  0 0 8    set3 50  Bin R  0 0 8    

我只想要ID和值元素 –

   set1 80   set3 50   

我如何使用XDocument和LINQ选择这些?

使用linq-to-xml,代码如下:

 var xml_str = @"  set1 80  Val R  0 0 8    set3 50  Bin R  0 0 8   "; var doc = XDocument.Parse(xml_str); var settings = new XElement("sets", from setting in doc.Element("sets").Elements("setting") select new XElement("setting", setting.Element("id"), setting.Element("value"))); Console.WriteLine(settings); 

打印:

   set1 80   set3 50   

如果你不需要转换的XML,但只是,比如id -> value mapping的字典,(将value存储为int ),你可以这样做:

 var doc = XDocument.Parse(xml_str); var settings_dict = doc.Element("sets").Elements("setting").ToDictionary(s => s.Element("id").Value, s => Convert.ToInt32(s.Element("value").Value)); 
 var xdoc = XDocument.Load(@"c:\myxml.xml"); var settings = xdoc.Element("sets").Elements("setting") .Select(s => new { Id = s.Element("id").Value, Value = s.Element("value").Value }); 

这将产生一个匿名类型的IEnumerable ,具有属性IdValue (两个字符串)。

您可以创建自己的Setting类型,并在投影中使用它,也可以根据需要将’value’字符串值转换为整数。

我的第一个答案与其他答案非常相似,并没有那么明确,所以我删除了它。 但是,我认为编写一些linq是一个很好的练习,当所需元素处于任意深度时,它将生成过滤后的XML。 这就是我提出的:

 Func f = null; f = e => e.Name == "id" || e.Name == "value" ? e : //on a match, return the node new[] { new XElement(e.Name, e.Elements().Select(f)) } //else recurse .FirstOrDefault(y => y.Elements().Any()); //keeping subtrees with matches XElement resultXmlElement = f(XDocument.Parse(yourXmlString).Root);