Нужна помощь с xml

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
У нас есть XML
88008
На скрине 5 блоков, из этих блоков мне нужно вытащить логины и проценты, выделил белыми прямоугольниками. В 3 блоке процентов нет, и моя предыдущая логика ломается.
Как я делал до этого.
Загонял всю структуру в xml, вытягивал ноды, потом по ним пробегался и все получал, было вот так
C#:
xmlDocument.LoadXml(instance.DroidInstance.Hierarchy.GetLayout());
var xml_nodes_nickname = xmlDocument.SelectNodes("//ViewGroup[@index>0]//TextView[@resource-id='in:id/nickname']");
var xml_nodes_yield = xmlDocument.SelectNodes("//ViewGroup[@index>0]//TextView[@resource-id='in:id/yieldView']");
for(int i=0; i<xml_nodes_nickname.count; i++){
    nickname = xml_nodes_nickname.Item(i).Attributes["text"].Value.ToString().Trim();
    total_koef = xml_nodes_yield.Item(i).Attributes["text"].Value.ToString().Trim();
}
И получал в целом все норм, но когда появляется 3 блок (на скрине выше), то все едет...
- берется второй ник и второй процент, тут ок
- берется третий ник, и учитывая что третьего процента нет, берется четвертый процент - уже все поехало
- четвертый ник, пятый процент и так далее...

Поэтому мне нужно брать ноду блока, например вот //ViewGroup[@index=3]
И там уже искать ник и процент, но у меня не выходит, я делаю вот так
C#:
var xml_nodes_index = xmlDocument.SelectNodes("//ViewGroup[@index=3]");
return xml_nodes_index.Item(0).SelectNodes("//TextView[@resource-id='in:id/nickname']").Item(0).Attributes["text"].Value;
т.е. беру блок с индексом 3. В этом блоке с индексом 3, беру нулевой элемент, он собственно там единственный. выбираю там ноду по xpath, по идее должен получать единственное число, а их там не 1, а все ники... Вот не понимаю, почему в единственной 3-ей ноде все логины... где ошибаюсь?

Пробовал сделать вот так, тоже не выходит... тупо ломается, и все...
C#:
var xml_nodes_nickname = xmlDocument.SelectNodes("//ViewGroup[@index>0]//TextView[@resource-id='in:id/nickname']");
// ники всегда есть, поэтому по ним и пробегаемся
for(int i=0; i<xml_nodes_nickname.Count; i++){
    nickname = total_koef = string.Empty;
    try{
        xml_nodes_nickname = xmlDocument.SelectNodes("//ViewGroup[@index="+i.ToString()+"]//TextView[@resource-id='in:id/nickname']");
        xml_nodes_yield = xmlDocument.SelectNodes("//ViewGroup[@index="+i.ToString()+"]//TextView[@resource-id='in:id/yieldView']");
        nickname = xml_nodes_nickname.Item(0).Attributes["text"].Value.ToString().Trim();
        total_koef = xml_nodes_yield.Item(0).Attributes["text"].Value.ToString().Replace("%","").Trim();
        project.SendInfoToLog(string.Join(" ", nickname, total_koef));
    }
    catch{
        continue;
    }
}
Подскажите, как мне достать из этого дурацкого (видимо потому что не знаю его хорошо...) xml информацию которую мне нужно?
спасибо
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 486
Благодарностей
3 356
Баллы
113
У вас неправильно построена логика.

Сначала узнайте общее кол-во ViewGroup (вероятно, это потребует создание общего, корневого элемента), потом обращайтесь конкретно к каждому ViewGroup и
проверяйте на наличие как 1-го ника, так и 1-го процента, если кого-то нет или их больше - пропускайте или выходите по ошибке.

Так же учитывайте, что кроме SelectNodes можно получать ноды по имени не используя XPath.
 
Последнее редактирование:
  • Спасибо
Реакции: arbplv

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)