使用Linq to XML删除父元素

3
我有一个这样的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个回答

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

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

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

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();
     }
 }

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();

这将删除所有符合条件的品牌元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接