Во-первых, переменная html
, которую вы пытаетесь проанализировать, является просто строкой JSON.Вам вообще не нужно HtmlDocument
.
В общих чертах вам нужно создать набор классов для десериализации данных.Поскольку вам нужна только часть информации, вам нужен только минимальный набор классов для описания структуры.
В JSON.net наилучшей подходящей структурой является Dictionary<,>
.В результате ключами будут имена членов, а значениями - любой тип записи, который мы выберем.В этом случае нас интересуют только имена членов, поэтому мы можем использовать пустой тип записи.
В этом случае минимальное JSON-представление интересующих нас частей выглядит примерно так:
{
{
"Aatrox": { "name":"Aatrox" },
"Ahri": { "name":"Ahri" },
"AurelionSol": { "name":"Aurelion Sol" }
}
}
Ниже приведена минимальная структура класса для разбора исходного файла, которая будет захватывать только ту информацию, которая нам интересна:
class ChampionsRoot
{
public Dictionary<string, ChampionInfo> data;
}
class ChampionInfo
{
public string name;
}
Теперь нам просто нужен некоторый код для извлечения этих имен из данных:
static void Main()
{
var url = "http://ddragon.leagueoflegends.com/cdn/6.24.1/data/en_US/champion.json";
var httpClient = new HttpClient();
var source = httpClient.GetStringAsync(url).Result;
var root = JsonConvert.DeserializeObject<ChampionsRoot>(source);
var names = root.data.Select(kv => kv.Value.name).ToArray();
}
А теперь names
- это массив всех значений name
.
Или, если вы хотите использовать регулярное выражение:
void Main()
{
var url = "http://ddragon.leagueoflegends.com/cdn/6.24.1/data/en_US/champion.json";
var httpClient = new HttpClient();
var source = httpClient.GetStringAsync(url).Result;
// "name":"(value)"
var regex = new Regex("\"name\":\"([^\"]+)\"");
var matches = regex.Matches(source);
var names = matches.OfType<Match>().Select(_ => _.Groups[1].Value).ToArray();
}
В данных нет других полей name
, поэтому он возвращает те же результаты, что и версия JSON.net, только без зависимости.