将HTML列表的内容传输到文本

时间:2011-01-06 23:05:45

标签: c# asp.net vb.net list xpath

如何做到这一点? .InnerText属性(在包含div元素时使用)仅给出了html。是否可以迭代所有包含的li元素并提取它们的值?

5 个答案:

答案 0 :(得分:2)

如果这应该在服务器端完成,请使用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 :(得分:2)

假设您在单独的变量中有列表(您已将其解压缩),并且 / 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 :(得分:1)

  

是否有可能遍历所有   李元素包含和提取   他们的价值观?

来自OP的评论

  

Doctype是HTML 5,有效   码。 - 拉杜

在这种情况下,可以使用以下XPath表达式

div//li//text()

这将选择所有li元素的后代的所有文本节点,这些元素是作为当前节点的子元素的任何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

答案 3 :(得分:0)

你总是可以用简单的regEx“强行”它,或者根据开头/结尾标签拆分字符串

答案 4 :(得分:0)

如果可能的话,我会使用jQuery循环遍历UL并返回每个LI的值。这些方面的东西......

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

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

});

当然,如果您需要服务器端的这些值,则需要对页面方法或Web服务进行某种类型的ajax调用。