Как спарсить атрибуты XML C#?

145
03 марта 2022, 01:20

Есть xml файл

<toplevel> 
<CompleteSuggestion> 
<suggestion data="keyshot"/> 
</CompleteSuggestion> 
<CompleteSuggestion> 
<suggestion data="keystone"/> 
</CompleteSuggestion> 
<CompleteSuggestion> 
<suggestion data="keystore explorer"/> 
</CompleteSuggestion> 
<CompleteSuggestion> 
<suggestion data="keyshape"/> 
</CompleteSuggestion> 
<CompleteSuggestion> 
<suggestion data="keysight technologies"/> 
</CompleteSuggestion> 
<CompleteSuggestion> 
<suggestion data="keys eset smart security"/> 
</CompleteSuggestion> 
<CompleteSuggestion> 
<suggestion data="keyshia cole"/> 
</CompleteSuggestion> 
<CompleteSuggestion> 
<suggestion data="keystone species"/> 
</CompleteSuggestion> 
<CompleteSuggestion> 
<suggestion data="keys"/> 
</CompleteSuggestion> 
<CompleteSuggestion> 
<suggestion data="keysmart"/> 
</CompleteSuggestion> 
</toplevel>

3 часа я пытался спарсить данные из data=" " Вроде все казалось легко, но что то не пошло, смотрел ответы на вопросы по теме, и так и не понял как это сделать. В итоге плюнул и сделал вот так

string s = Doc.OuterXml; 
            string reg = "(?<=data=\").*?(?=\")"; 
            Regex regex = new Regex(reg); 
            MatchCollection matches = regex.Matches(s); 
            if (matches.Count > 0) 
            { 
                foreach (Match match in matches) 
                    Console.WriteLine(match.Value); 
            } 
            else 
            { 
                Console.WriteLine("Совпадений не найдено"); 
            }

Как я понял xml документ можно обрабатывать через LINQ и через System.Xml, оба способа мне показались очень сложными. Если вас не затруднит напишите пожалуйста как это сделать правильно а не через регулярные выражения. И почему не стоит использовать regex для таких вещей? Ведь вроде удобно и легко.

Answer 1

Как говорится LINQ to XML вам в помощь...

Вам понадобиться:

  • Класс XDocument и его 3 метода:
    • .Element() - Берем один объект.
    • .Elements() - Берем коллекцию объектов.
    • .Attribute() - Получаем атрибут данной "ноды".

В итоге получаем код:

var compleated = XDocument.Load("testFile.txt").Element("toplevel").Elements("CompleteSuggestion");
foreach (var item in compleated)
{
    Console.WriteLine(item.Element("suggestion").Attribute("data").Value);
}
  • XDocument.Load("testFile.txt") - загрузили некий документ.
  • .Element("toplevel") - взяли <toplevel> из этого документа.
  • .Elements("CompleteSuggestion") - из предыдущего узла взяли все <CompleteSuggestion>.
  • foreach (var item in compleated) - циклом проходимся по полученным объектам.
    • item.Element("suggestion") - у каждого объекта, который дает нам цикл мы берем <suggestion/>.
    • .Attribute("data") - получаем атрибут data у найденного объекта.
    • .Value - ну и забираем его значение.

Результат:

keyshot
keystone
keystore explorer
keyshape
keysight technologies
keys eset smart security
keyshia cole
keystone species
keys
keysmart

Если надо получить только значение атрибутов, а на остальное грубо говоря пофиг, то подключаем LINQ и переписываем на нечто такое:

var result = XDocument.Load("testFile.txt")
    .Element("toplevel")
    .Elements("CompleteSuggestion")
    .Select(x=>x.Element("suggestion")
    .Attribute("data").Value);

Результатом будет коллекция из string значений.

READ ALSO
AngleSharp Как подключить прокси?

AngleSharp Как подключить прокси?

Похожий вопрос уже был но там немного другой код, а я немного разобрался в своем коде и боюсь его сломать

100
Не записывается значение в ячейку GridView

Не записывается значение в ячейку GridView

Данный код, в случае его выполнения, должен прописывать в определённую ячейку текст "Выявлены ошибки"При пошаговом выполнении вижу, что программа...

100
Не работает отладка в Local IIS

Не работает отладка в Local IIS

Не работает отладка в Local IIS, пробовал на 3 ПК безрезультатно везде тажа ситуацияПроект на ASP

150