从大型html文件中获取元素

时间:2016-10-07 22:58:44

标签: c# html asp.net regex

我有一个很大的html文件(80个月),如:

<html>
   <head>...</head>
   <body>
      <div class="nothing">...</div>
      <div class="content">
         <h1>Hello</h1>
         <div>
            <div class="phone"> ... </div>
            <div class="phone"> ... </div>
            <div class="phone"> ... </div>
         </div>
         <div>
            <div class="phone">
               ...
               <div>
                  ...
               </div>
               ...
            </div>
            <div class="phone"> ... </div>
         </div>
         <div>
            <div class="phone"> ... </div>
            <div class="phone"> ... </div>
            <div class="phone"> ... </div>
            <div class="phone"> ... </div>
         </div>
      </div>
   </body>
</html>

我无法手动修改此html文件,因此最好保持只读。

我想将<div class="phone"> ... </div>的每一行存储在一个字符串表中,以便以后能够操作它。在div中,还有其他元素可以是任何东西。

  1. 我尝试使用HtmlDocument和XmlDocument加载此文件,但文件太大,以至于我得到内存不足异常
  2. 我尝试使用正则表达式来获取表格中的所有元素,但我无法管理它。
  3. 我使用的正则表达式是:

    Regex.Matches(myHtml, "<div class=\"phone\">[\\p{L}\\s]*\\,*[\\p{L}\\s]*<div");
    

    这个正则表达式需要每个

    <div class="phone"> ANY UTF8 char </div>
    

    但问题是:这个正则表达式获取所有UTF8字符,直到它找到下一个</div>,但是这个结束div不一定是第一个开始div的结束div。

    我有什么想法可以做到这一点?我们不能在不同的字符串中剪切此文件以便能够将其加载到htmlDocument中吗?

    感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用XmlReader类来读取文件。 XmlReader不会将整个文件加载到内存中,但允许您在动态解析文档时逐节点地移动XML文档。

有关如何使用class = phone:

读取所有div的内容的示例
using (XmlReader reader = XmlReader.Create(@"C:\A.html"))
{
     // Loop over all xml tags 
     while (reader.Read())
     {
          // Check we have a div whith attribute class = phone
          if(reader.Name == "div" && reader.GetAttribute("class") == "phone")
          {
               // Yes, so read until the corresponding closing tag and output content
               textBox1.AppendText(reader.ReadInnerXml() + Environment.NewLine);
          }
     }
}

有关详细信息,请参阅documentation

答案 1 :(得分:-1)

您可以使用jQuery循环使用类phone的所有元素,并将它们存储在HiddenField中。然后在PostBack上,您可以访问这些值并进行处理。

<asp:HiddenField ID="HiddenField1" runat="server" />

<script type="text/javascript">
    function getValues() {
        var valueArray = new Array();
        var valueString = "";
        $(".phone").each(function (index, element) {
            //for demo store both in hiddenfield and javascript array
            valueArray.push(element.innerHTML);
            valueString += element.innerHTML + ",";
        });
        $("#<%=HiddenField1.ClientID %>").val(valueString);
    }
</script>

在代码隐藏中:

    protected void Button1_Click(object sender, EventArgs e)
    {
        string valueString = HiddenField1.Value;
        if (!string.IsNullOrEmpty(valueString))
        {
            string [] valueArray = valueString.TrimEnd(',').Split(',');
            foreach (string s in valueArray)
            {
                //do stuff
            }
        }
    }