• HtmlAgilityPack解析全国区号页面到XML


    需求:完成一个城市和区号的xml配置文件

    处理思路:通过HtmlAgilityPack解析一个区号页面,生产xml文件

    页面:http://www.hljboli.gov.cn/html/code.html

    代码:

     1   public void LoadUrl(string url)
     2         {
     3 
     4             try
     5             {
     6                 //Tab1
     7                 this.webBrowser1.Url = new Uri(url);
     8 
     9                 HtmlWeb web = new HtmlWeb();
    10                 //不加这行中文会乱码
    11                 web.OverrideEncoding = Encoding.Default;
    12                 HtmlAgilityPack.HtmlDocument doc = web.Load(url);
    13                 //通过反射获取 internal 字段值
    14                 FieldInfo info = doc.GetType().GetField("Text", BindingFlags.Instance | BindingFlags.NonPublic);
    15                 var text = info.GetValue(doc).ToString();
    16                 //Tab2
    17                 this.richTextBox1.Text = text;
    18               
    19                 var sb = new StringBuilder();
    20                 sb.Append("<?xml version="1.0" encoding="utf-8" ?>").AppendLine();
    21                 sb.Append("<codes>").AppendLine();
    22 
    23                 //xpath表达式
    24                 var provinceNodes = doc.DocumentNode.SelectNodes("//tr");
    25 
    26                 //过滤重复的区号
    27                 var tempList = new List<string>();
    28                 foreach (var provinceNode in provinceNodes)
    29                 {
    30                     //xpath表达式
    31                     var cityNodes = provinceNode.SelectNodes("td");
    32 
    33                     if (cityNodes.Count == 1)
    34                     {
    35                         if (cityNodes[0].InnerText != "&nbsp;") //去除空白行
    36                             sb.AppendFormat("<!--{0}-->", cityNodes[0].InnerText).AppendLine();
    37                     }
    38                     if (cityNodes.Count == 6)
    39                     {
    40                         if (cityNodes[1].InnerText != "长途区号")
    41                         {
    42                             if (!tempList.Contains(cityNodes[1].InnerText))
    43                             {
    44                                 sb.AppendFormat("<code name="{0}" value="{1}" />", cityNodes[0].InnerText, cityNodes[1].InnerText).AppendLine();
    45                                 tempList.Add(cityNodes[1].InnerText);
    46                             }
    47 
    48                             if (cityNodes[3].InnerText != "&nbsp;" && !tempList.Contains(cityNodes[4].InnerText))//去除行不满情况
    49                             {
    50                                 sb.AppendFormat("<code name="{0}" value="{1}" />", cityNodes[3].InnerText, cityNodes[4].InnerText).AppendLine();
    51                                 tempList.Add(cityNodes[4].InnerText);
    52                             }
    53                         }
    54                     }
    55                 }
    56                 sb.Append("</codes>").AppendLine();
    57 
    58                 this.richTextBox2.Text = sb.ToString();
    59 
    60             }
    61             catch (Exception)
    62             {
    63 
    64 
    65             }
    66 
    67 
    68         }
    View Code

    注意:
    1.中文乱码,需要设置    web.OverrideEncoding = Encoding.Default;

    2.通过反射访问HtmlDocument的内置字段Text获取body的内容

          FieldInfo info = doc.GetType().GetField("Text", BindingFlags.Instance | BindingFlags.NonPublic);
         var text = info.GetValue(doc).ToString();

    3.通过xpath表达式获取节点元素

  • 相关阅读:
    设计模式天天练。
    系统资料库msdb置疑或者不可用的解决方法
    依赖注入IOC
    重载、重写、隐藏的区别
    ASP.NET中的HttpWorkerRequest对像及其应用
    ASP.NET的错误处理机制
    Web.Config
    asp.net 2.0页面生命周期
    FileUpLoad控件上传大容量文件
    大文件上传
  • 原文地址:https://www.cnblogs.com/zhaobl/p/3575285.html
Copyright © 2020-2023  润新知