当前位置: 首页 > news >正文

C# XPath的概念

一 XPath的概念

1 XPath是对XML进行查询的表达式

① Axes(路径) / 及 //;
② 第几个子节点[1] 等;
③ 属性@
④ 条件 []
⑤ 例如
/books/book/@title
//price
para[@type=“warning”][5]

2 使用XPath

① XmlDocument doc=new XmlDocument();
② doc.LoadXml(strXml);
③ XmlElement root=doc.DocumentElement;
④ XmlNodeList nodes=
root.SelectNodes(strXPath);
XmlNode node=root.SelectSingleNode(strXPath);
node的.NodeType .InnerXml及.Value;

3 使用Xlst进行转换

在这里插入图片描述

XMLDocument doc=new XMLDocument();
doc.Load(@".\BookList.xml");
XPathNavigator nav=doc.Createnavigator();
nav.MoveToRoot();
XslTransform xt=new XslTransform();
xt.Load(@".\BookList.xslt");
XmlTextWriter writer=new XmlTextWriter(Console.Out);
xt.Transform(nav,null,writer);


using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;

namespace 网络爬虫
{
    public class Crawler
    {
        private WebClient webClient = new WebClient();
        private Hashtable urls = new Hashtable();
        private int count = 0;

        static void Main(string[] args)
        {
            Crawler myCrawler = new Crawler();
            string startUrl = "http://www.cnblogs.com/dstang2000";
            if (args.Length >= 1)
                startUrl = args[0];
            myCrawler.urls.Add(startUrl, false);//加入初始页面
            new Thread(new ThreadStart(myCrawler.Crawl)).Start();//开始爬行
            Console.ReadKey();
        }

        private void Crawl()
        {
            Console.WriteLine("开始爬行了.....");
            while(true)
            {
                string current = null;
                foreach(string url in urls.Keys)//找到一个还没有下载过的链接
                {
                    if ((bool)urls[url])
                        continue;//已经下载过的,不再下载
                    current = url;
                }

                if (current == null || count > 10)
                    break;

                Console.WriteLine("爬行" + current + "页面!");

                string html = DownLoad(current);//下载

                urls[current] = true;

                count++;

                Parse(html);//解析,并加入新的链接
            }
            Console.WriteLine("爬行结束");
            
        }

        public string DownLoad(string url)
        {
            try
            {
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
                req.Timeout = 30000;
                HttpWebResponse response = (HttpWebResponse)req.GetResponse();
                byte[] buffer = ReadInstreamIntoMemory(response.GetResponseStream());
                string fileName = count.ToString();
                FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate);
                fs.Write(buffer, 0, buffer.Length);
                fs.Close();
                string html = Encoding.UTF8.GetString(buffer);
                return html;
            }
            catch
            { }
            return "";
        }

        public void Parse(string html)
        {
            string strRef = @"(href|HREF|src|SRC)[ ]*=[ ]*[""'][^""'#>]+[""']";
            MatchCollection matches = new Regex(strRef).Matches(html);
            foreach(Match match in matches)
            {
                strRef = match.Value.Substring(match.Value.IndexOf('=') + 1).Trim('"', '\'', '#', ' ', '>');
                if (strRef.Length == 0)
                    continue;

                if (urls[strRef] == null)
                    urls[strRef] = false;
            }
        }

        private static byte[] ReadInstreamIntoMemory(Stream stream)
        {
            int bufferSize = 16384;
            byte[] buffer = new byte[bufferSize];
            MemoryStream ms = new MemoryStream();
            while(true)
            {
                int numBytesRead = stream.Read(buffer, 0, bufferSize);
                if (numBytesRead <= 0)
                    break;
                ms.Write(buffer, 0, numBytesRead);
            }
            return ms.ToArray();
        }
    }
}

相关文章:

  • redhat9安装卸载mysql
  • 个人博客系统(前后端分离)
  • 商品分类管理系统实现(Vue + ElementUI)
  • ReactJS入门之Model层
  • 一文解析Linux中断子系统softirq和tasklet
  • Arduino与Proteus仿真实例-雷达扫描仿真
  • Redis高可用之集群架构(第三部分)
  • 京东零售大数据云原生架构实践
  • 铝合金表面处理废水除铝工艺
  • Ansible剧本使用
  • 【JavaScript】基于SPA的单页面路由
  • Java基础:Lambda表达式方法引用
  • 嵌入式:ARM常用开发编译软件介绍
  • (三)HTTPTomcatServlet
  • MySQL主从搭建
  • 20221226编译Toybrick的TB-RK3588X开发板的Android12系统3
  • 并查集解决重复员工问题
  • 详细介绍关于自定义类型:结构体、枚举、联合【c语言】
  • 【swaggo】swaggo使用详解
  • 2022圣诞代码合集(圣诞树+圣诞老人)
  • 四川省社科联期刊:不建议在读硕士、博士将导师挂名为第一作者
  • 伊朗港口爆炸已致46人死亡
  • 找化学的答案,解人类的命题:巴斯夫的“变革者”成长之道
  • 一个失败的赛季咎由自取,皇马只能把希望留到夏天
  • 规范涉企案件审判执行工作,最高法今天发布通知
  • 国家统计局:一季度规模以上工业企业利润延续持续恢复态势