我有这样的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查询
答案 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();