Как разделить список ul на List <string>с помощью li с помощью класса или другого атрибута - PullRequest
0 голосов
/ 27 августа 2018

У меня есть список HTML ul:

<ul>
<li class="ng-scope">Item 1</li>
<li class="ng-scope">Item 2</li>
<li class="ng-scope">Item 3</li>
</ul>

Я хочу преобразовать его в List<string> в C #. Элемент li может иметь атрибут или не иметь его. Например. это может быть <li class="ng-scope"> или просто <li>

Сейчас я делаю так:

            string patternUL = @"<(ul|ol)[\s]*[^\>]*>(<li[ a-z=""\\]*>.*?</li>)+?</\1>";
            string trg = Regex.Replace(source, patternUL, (param) =>
            {
                foreach (Capture c in param.Groups[2].Captures)
                {
                    output += $"{Regex.Replace(c.Value.Replace("&amp;", "&"), "<li>(.*?)</li>", "$1")}|";
                }
                //}
                return output;
            });

Но я не разделяю список на строку List - он не соответствует шаблону. Если я передаю ul список с li без какого-либо атрибута, тогда он работает нормально.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Не рекомендуется анализировать html с регулярным выражением. Вместо этого используйте фреймворк, такой как пакет agility HTML . Таким образом вы можете получить все <li></li> в виде списка:

var html = @"
    <ul>
       <li class=""ng-scope"">Item 1</li>
       <li class=""ng-scope"">Item 2</li>
       <li class=""ng-scope"">Item 3</li>
    </ul>";

var doc = new HtmlDocument();
doc.LoadHtml(html);

var list = new List<string>(doc.DocumentNode.SelectNodes("//li").Select(li => li.InnerText));
0 голосов
/ 27 августа 2018

Я предлагаю вам использовать HtmlAgilityPack для разбора html:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(File.ReadAllText("test.txt")); // here you can give a normal string
foreach (var li in doc.DocumentNode.SelectNodes("//li")) // select li only
{
    output += li.InnerText; // here do what you want to do
}

Захватывает следующие тексты:

Item1
Item2
Item3
...