2016-02-05 2 views
1

У меня есть HTML таблицу, как это:Повторные группы для формирования объектов

<table style="width:100%"> 
 
    <tr> 
 
    <td class="country">Germany</td> 
 
    </tr> 
 
    <tr> 
 
    <td class="city">Berlin</td> 
 
    </tr> 
 
    <tr> 
 
    <td class="city">Cologne</td> 
 
    </tr> 
 
    <tr> 
 
    <td class="city">Munich</td> 
 
    </tr> 
 
    <tr> 
 
    <td class="country">France</td> 
 
    </tr> 
 
    <tr> 
 
    <td class="city">Paris</td> 
 
    </tr> 
 
     <tr> 
 
    <td class="country">USA</td> 
 
    </tr> 
 
    <tr> 
 
    <td class="city">New York</td> 
 
    </tr> 
 
    <tr> 
 
    <td class="city">Las Vegas</td> 
 
    </tr> 
 
</table>

Из этой таблицы, я хочу, чтобы создать объекты, такие как страны классов и города. У страны будет список городов.

Теперь проблема: Легко создать регулярное выражение, чтобы получить все страны и все города, но мне интересно, могу ли я получить группы для повторения городов до следующей страны? Мне нужно сделать это, потому что я не могу понять программно, какой город принадлежит какой стране, если я их в отдельном регулярном матче.

Он должен быть как (быстрое & грязного раствора):

country">([\w]*)<{.*\n.*\n.*\n.*"city">([\w]*)} 

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

Если у вас есть совершенно другая идея о том, как получить объекты из таблицы html в C#, дайте мне знать!

Заранее благодарен!

+0

который Формет данные, которые вы хотите список, DataTable, вар .. –

+0

А вы используя jquery? – Anil

+0

Меня не волнует формат. Я использую C#, в html-коде я не имею никакого влияния. – FKutsche

ответ

1

Согласитесь, что для любого нетривиального HTML должен использоваться парсер HTML, например HtmlAgilityPack. С учетом сказанного, если ваш HTML так же просто, как фрагмент кода выше, это работает, даже если есть несколько разрывов строк в строке:

string HTML = @" 
<table style='width:100%'> 
    <tr><td class='country'>Germany</td></tr> 
    <tr><td class='city'>Berlin</td></tr> 
    <tr><td class='city'>Cologne</td></tr> 
    <tr><td class='city'>Munich</td></tr> 
    <tr><td class='country'>France</td></tr> 
    <tr><td class='city'>Paris</td></tr> 
    <tr><td class='country'>USA</td></tr> 
    <tr><td class='city'>New York</td></tr> 
    <tr><td class='city'>Las Vegas</td></tr> 
</table>"; 

var regex = new Regex(
    @" 
     class=[^>]*? 
     (?<class>[-\w\d_]+) 
     [^>]*> 
     (?<text>[^<]+) 
     < 
    ", 
    RegexOptions.Compiled | RegexOptions.IgnoreCase 
    | RegexOptions.IgnorePatternWhitespace 
); 

var country = string.Empty; 
var Countries = new Dictionary<string, List<string>>(); 
foreach (Match match in regex.Matches(HTML)) 
{ 
    string countryCity = match.Groups["class"].Value.Trim(); 
    string text = match.Groups["text"].Value.Trim(); 
    if (countryCity.Equals("country", StringComparison.OrdinalIgnoreCase)) 
    { 
     country = text; 
     Countries.Add(text, new List<string>()); 
    } 
    else 
    { 
     Countries[country].Add(text); 
    } 
} 
Смежные вопросы