通过多个值过滤Xdocument

时间:2014-04-16 14:04:34

标签: xml linq

我有这样的XML:

- <root>
- <YEAR>
  <list_item  child_id="0" list_entry_id="1">2012</list_item> 
  <list_item  child_id="0" list_entry_id="2">2011</list_item> 
  <list_item  child_id="0" list_entry_id="3">2010</list_item> 
</YEAR>
</root>

我想基于list_entry_id从上面的xml中删除一些节点/年。此过滤器也可以是多个值。例如:想要使用(1,2)中的list_entry_id过滤节点。我尝试了下面的linq查询,它只适用于单个过滤器。

  string sXML="xmlstring";
     string syear="1,2";
     XDocument doc = XDocument.Parse(sXML);
      doc.Element("root").Element("YEAR").Elements("list_item").Where(x => (string)x.Attribute("list_entry_id") != syear).Remove();

请帮助获取可以过滤多个值的linq查询

1 个答案:

答案 0 :(得分:0)

问题出在Where(x => (string)x.Attribute("list_entry_id") != syear)之内 - 您将个人list_entry_id与整个过滤字符串进行比较。

最简单的情况是,当您的过滤字符串为1时,这将有效,因为会有匹配的list_entry_id,但只要您开始向过滤器添加任何其他内容,例如如上所述1,2,您将无法找到匹配的list_entry_id

您可以采取几种方法来获得所需的结果。与你已经拥有的东西相差太远(假设你需要接受你的过滤器作为一个字符串),就是拆分过滤器字符串,并使用结果删除不需要的节点:

XDocument doc = XDocument.Parse("<root><YEAR><list_item child_id=\"0\" list_entry_id=\"1\">2012</list_item><list_item child_id=\"0\" list_entry_id=\"2\">2011</list_item><list_item child_id=\"0\" list_entry_id=\"3\">2010</list_item></YEAR></root>");

string syear="1,2";

string[] validIds= syear.Split(',');

doc
.Element("root")
.Element("YEAR")
.Elements("list_item")
.Where(x => !validIds.Contains(x.Attribute("list_entry_id").Value)).Remove();

实际上,如果id未包含在有效ID中,请删除相关节点。

您还可以重写为:

doc
.Descendants("list_item")
.Where(x => !validIds.Contains(x.Attribute("list_entry_id").Value))
.Remove();
相关问题