使用Linq到XML删除父元素

时间:2012-02-01 17:41:21

标签: c# linq c#-4.0 linq-to-xml

我有一个这种XML文件

<BallList>
<Brand name="xyz">
    <BallName>ball A</BallName>
    <DateApproved>Jan-12</DateApproved>
    <link>www.a.com</link>
</Brand>
<Brand name="abc">
    <BallName>Ball B</BallName>
    <DateApproved>Jan-02</DateApproved>
    <link>www.b.com</link>
</Brand>
</BallList>

通过这种方式,大约有150个品牌和8000个球名。我知道这不是表示XML的好方法,但现在由于数据量很大,结构无法修改。

我需要通过将“品牌”节点与其球名

进行比较来删除它

以下是我要尝试的代码:

XElement doc = XElement.Load(Server.MapPath("NetBalls.xml"));
doc.Elements("Brand")
   .Where(s => s.Attribute("name").Value == DropDownList1.SelectedItem.Text)
   .Elements("BallName")
   .Where(l => l.Value == textbox1.Text)
   .AncestorsAndSelf()
   .Remove();

我正在尝试搜索品牌并进入其元素节点并检查其节点并删除其父节点。

任何人都可以帮我吗?

4 个答案:

答案 0 :(得分:3)

不是导航到子节点并再次备份,而是将子级标准嵌入到Where查询中,针对您实际需要的元素:

doc.Elements("Brand")
   .Where(s => s.Attribute("name").Value == selectedBrand)
   .Where(s => s.Elements("BallName").Any(l => l.Value == selectedValue))
   .Remove();

这样,您的Linq查询更符合您的英文查询:“找到名称属性为x且其Ballname元素为y的所有Brand元素,并将其删除。”

答案 1 :(得分:1)

您想要删除品牌元素吗?试试这个:

xml.Elements("Brand")
   .Where(s => s.Attribute("name").Value == DropDownList1.SelectedItem.Text)
   .Elements("BallName")
   .Where(l => l.Value == textbox1.Text)
   .Select(x => x.Parent)
   .Remove();

这将删除条件适用的所有品牌元素。

答案 2 :(得分:1)

您可以在单个where子句中组合选择条件:

doc.Elements("Brand")
    .Where(brand =>
        (string)brand.Attribute("name") == DropDownList1.SelectedItem.Text &&
        brand.Elements("BallName").Any(ballName => (string)ballName == textbox1.Text))
    .Remove();

答案 3 :(得分:1)

 string brandName = "xyz";
 string ballName = "ball A";
 var brands = doc.Elements("Brand").Where(s => s.Attribute("name").Value == brandName);
 foreach (var brand in brands)
 {
     if(brand.Elements("BallName").Any(l => l.Value == ballName))
     {
         brand.Remove();
     }
 }