Передача содержимого списка HTML в текст - PullRequest
3 голосов
/ 07 января 2011

Как это можно сделать?Свойство .InnerText (при использовании для содержащего элемента div) дает мне только HTMLМожно ли перебрать все содержащиеся в нем элементы li и извлечь их значения?

Ответы [ 5 ]

2 голосов
/ 12 января 2011

Предполагая, что у вас есть список в отдельной переменной (вы его распаковали), и нет ничего между / li и следующим li :

string[] sep = {"</li>"};
foreach (string s in html.Replace("<li>","").Split(sep, StringSplitOptions.None)) 
//do something with s

Простое консольное приложение для тестирования:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string html = "<li>123</li><li>456</li>";
            string[] sep = {"</li>"};
            foreach (string s in html.Replace("<li>","").Split(sep, StringSplitOptions.None)) 
                Console.WriteLine(s);
            Console.ReadLine();
        }
    }
}
2 голосов
/ 12 января 2011

Используйте HTML Agilitypack , если это должно быть сделано на стороне сервера.

var nodes = doc.SelectNodes("//ul[@id=\"myId\"]/li");
List<string> items = new List<string>();
foreach (var node in nodes)
    items.Add(node.InnerText);

Обновление

Сценарий jquery, который делает то же самое (для клиентской стороны):

<script type="text/javascript">
    function convertUlToText(ulID)
    {
        var text = '';
        $('#' + ulID + ' li').each(function() {
          text += $(this).html() + '\r\n';
        }
        return text;
    }
</script>

Использование:

var textList = convertUlToText('myId');
1 голос
/ 15 января 2011

Возможно ли выполнить итерацию по всем содержащимся в li элементам и извлечь их значения?

Из комментария к OP :

Doctype - это HTML 5, и это действительный код.- Radu

В этом случае можно просто использовать следующее выражение XPath :

div//li//text()

. Здесь выбираются все текстовые узлы, которые являются потомками всех * 1018.* элементы, являющиеся потомками любого div элемента, являющегося дочерним элементом текущего узла.

Рекомендуется использовать выражение XPath для выбора узлов в XML (а HTML5 - это правильно сформированный XML), большинствопростой и более надежный способ, чем сделать это с трудом для построения, сложным для тестирования и трудным для понимания и поддержки регулярных выражений.

Вот полный пример кода :

using System;
using System.Xml;

class TestXPath
{
    static void Main(string[] args)
    {
        string html5Text =
@"<html>
 <head>
 </head>
 <body>
  <div>
   <ul>
    <li>Line 1</li>
    <li>Line 2</li>
    <li>Line 3</li>
   </ul>
  </div>
 </body>
</html>";

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(html5Text);

        string xpathExpr = @"/*/*/div//li//text()";

        XmlNodeList selection = doc.SelectNodes(xpathExpr);

        foreach (XmlNode node in selection)
        {
            Console.WriteLine(node.OuterXml);
        }

    }
}

при выполнении вышеуказанного приложения выдается искомый правильный результат :

Line 1
Line 2
Line 3
0 голосов
/ 12 января 2011

если возможно, я бы использовал jQuery, чтобы пройти через UL и вернуть значения каждого LI.Что-то вроде этого ...

$('li').each(function () {

    alert($(this).html());

});

Конечно, если вам нужны эти значения на стороне сервера, потребуется какой-то ajax-вызов метода страницы или веб-службы.

0 голосов
/ 07 января 2011

вы всегда можете «перебить» его простым regEx или разбить строку на основе начальных / конечных тегов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...