Linq to XML: удалить дубликаты из элемента

1

У меня есть xml файл, содержащий такие вещи:

 <item>
  <key>Some text</key>
  <explanation>Some more text</explanation>
  <content language="en-gb">word</content>
  <content language="en">word</content>
</item>

Я хочу узнать, имеет ли какой-либо из тегов <content> атрибут language одинаковое значение, а затем удаляет дублируемое поле. В этом случае, например, есть два тега content со значением word. Я хочу удалить один из них.

  • 0
    Должны ли language=en и language=en-gb считаться дубликатами?
  • 0
    Нет, слово, следующее за ним, должно быть проверено на наличие дубликатов.
Теги:
linq-to-xml

2 ответа

1
Лучший ответ
var contents = XDocument.Parse(xml);

// Select only elements that have the language attribute
var result = from item in contents.Descendants()
             where item.Attribute("language") != null
             select item;

// Returns only those elements that have at least another element
// with the same value.
var resultDuplicates = result
    .GroupBy(s => s.Value)
    .SelectMany(grp => grp.Skip(1));

// If duplicates found, replace them in the original xml.
if (resultDuplicates.Count() > 0)
{
    foreach(var entry in resultDuplicates)
        xml = xml.Replace(entry.ToString(), string.Empty);
}
  • 0
    Работает отлично, спасибо.
2

Вы можете сделать это с помощью простого запроса LINQ to XML:

var duplicates = xml.Descendants("content")
        .GroupBy(g => (string)g.Value)
        .Where(g => g.Count() > 1)
        .SelectMany(g => g.Take(1));

duplicates.Remove();
  • 0
    +1 Это хорошо работает. Хотя я не знаю, почему вы включили последнюю строку; он в основном удаляет все результаты из списка, а не из XML, как требуется (хотя это простой шаг).
  • 0
    Это неверно IEnumerable<XElement> содержит ссылки на исходные узлы XML. Это удалит их из исходного XML. попробуйте и посмотрите :)
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню