2014-04-16 36 views
0

我有一个这样的XML:过滤的XDocument由多个值

- <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查询,可以内Where(x => (string)x.Attribute("list_entry_id") != syear)过滤多个值

回答

0

的问题是 - 你是比较个别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();