Как найти дубликаты в XML, если элемент содержит значение в C#?

У меня есть XML:

<root>
<p>This is a Value</p>
<p>This is a Value</p>
<p>This is a Value</p>
<p>This is a Value</p>
<p>This is a Value</p>
<p>This is a Value</p>
<h3>Another Value</h3>
<h3>Another Value</h3>
<h3>Another Value</h3>
<h3>Another Value</h3>
<h3>This is Another Value</h3>
</root>

Я хочу найти повторяющиеся значения. Итак, я сделал это:

var valueDuplicate = xdoc.Descendants().Where(n => n.Name.LocalName == "p" || n.Name.LocalName == "pw" ||
                                                       n.Name.LocalName == "plt" || n.Name.LocalName == "psf")
                             .GroupBy(x => x.Value).Where(g => g.Count() > 1)
                             .Select(g => new { ElementValue = g.Key, Count = g.Count() }).ToList();
string s = string.Join(Environment.NewLine, valueDuplicate.Select(t => "Value: " + t.ElementValue.Trim() + "- "
                                                                                        + t.Count + " times."));

Это находит повторяющиеся значения, но не отображает <h3>This is Another Value</h3> как дубликат. Я хочу найти все элементы, которые также содержат значение.

Использовать g.Count() >= 1 ?

Ocaso Protal 22.05.2019 11:59

Это ищет почти все в файле. Я хочу искать только отдельные значения в valueDuplicate.

Omanshu Chaurasia 22.05.2019 12:10

Вам нужен Группа по с содержимым?

AmirNorouzpour 22.05.2019 12:12

@AmirNorouzpour - Да. Итак, все элементы Equals() или Contains()Стоимость или Другое значение будут показаны. Мой код имеет дело только с Equals()

Omanshu Chaurasia 22.05.2019 12:13

Ваш вывод должен быть: Значение: Значение - 11 раз.?

AmirNorouzpour 22.05.2019 12:25

@AmirNorouzpour - Да. Ты прав. Я отредактирую вопрос, так как этот ввод может сбивать с толку.

Omanshu Chaurasia 22.05.2019 12:39

@AmirNorouzpour - я отредактировал вопрос, поэтому вывод не будет Значение: это значение - 6 раз и Значение: другое значение - 5 раз.

Omanshu Chaurasia 22.05.2019 12:42
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
7
229
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

XDocument XDocument = XDocument.Parse(MyXmlFile);
        var grouped = XDocument.Descendants("P").GroupBy(x => x.Value).Where(g => g.Count() > 1);
        foreach (var groupItem in grouped)
        {
            foreach (var item in groupItem)
            {
                Console.WriteLine(item);
            }
        }

Похоже, это будет иметь тот же результат, что и мой. Это не касается Contains(), только Equals().

Omanshu Chaurasia 22.05.2019 12:20

var xml_Doc = XDocument.Load(Server.MapPath("xmlpath.xml")); IEnumerable<XElement> search_date = null; search_date = (из xFi в xml_Doc.Descendants("Список"), где xFi.Element("tag").Value.Contains("value") select xFi );

Bhavin Tanna 22.05.2019 13:02
Ответ принят как подходящий
XDocument xdoc = XDocument.Parse(xml);
var values = xdoc.Descendants().Select(x => x.Value);
var valueDuplicate = xdoc.Descendants().Select(r => new
 {
  el = r,
  value = values.FirstOrDefault(c => r.Value.Contains(c) || r.Value == c)
 }).GroupBy(x => x.value, x => x.el).Where(x => x.Count() > 1).ToList();

string s = string.Join(Environment.NewLine, valueDuplicate.Select(t => "Value: " + t.Key.Trim() + "- " + t.Count() + " times."));

Это работает :). Просто обновление, по какой-то причине оно также принимает нулевые значения в переменной valueDuplicate.

Omanshu Chaurasia 22.05.2019 15:04

Другие вопросы по теме