У меня есть 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
. Я хочу удалить один из них.
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);
}
Вы можете сделать это с помощью простого запроса 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();
IEnumerable<XElement>
содержит ссылки на исходные узлы XML. Это удалит их из исходного XML. попробуйте и посмотрите :)
language=en
иlanguage=en-gb
считаться дубликатами?