Удаление родительского элемента с использованием Linq to XML - PullRequest
3 голосов
/ 01 февраля 2012

У меня есть 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 голосов
/ 01 февраля 2012

Вместо перехода вниз к дочерним узлам и повторного создания резервной копии просто вставьте критерии дочернего уровня в запрос Where для элементов, которые вам действительно нужны:

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

Таким образом, ваш Linqзапрос более точно соответствует вашему английскому запросу: «Найдите мне все элементы Brand, где атрибут name - x, а их элемент Ballname - y, и удалите его».

1 голос
/ 01 февраля 2012
 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 голос
/ 01 февраля 2012

Вы можете объединить критерии выбора в одном предложении where:

doc.Elements("Brand")
    .Where(brand =>
        (string)brand.Attribute("name") == DropDownList1.SelectedItem.Text &&
        brand.Elements("BallName").Any(ballName => (string)ballName == textbox1.Text))
    .Remove();
1 голос
/ 01 февраля 2012

Вы хотите удалить элемент бренда? Попробуйте это:

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

При этом будут удалены все элементы торговой марки, к которым применяются условия.

...