博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记录下DynamicXml和HtmlDocument 使用方式
阅读量:6147 次
发布时间:2019-06-21

本文共 6034 字,大约阅读时间需要 20 分钟。

之前解析都是XmlDocument.Load 而现在可以利用DynamicXml生成Dynamic对象实现强类型操作,很好用.

///         /// 根据Xml路径动态解析成XML-Object        ///         ///         /// 
public static DynamicXml ReturnDynamicXml(this string fileName) { if (string.IsNullOrWhiteSpace(fileName)) return null; try { DynamicXml xmlObject = DynamicXml.Load(fileName); Console.WriteLine(fileName + "-XML解析数据成功"); return xmlObject; } catch { Console.WriteLine(fileName + "-XML解析数据失败,任务中断"); return null; } }
public class DynamicXml : DynamicObject {        #region Fields        public XElement _root;        #endregion        #region .Ctor        private DynamicXml(XElement root) {            _root = root;        }        #endregion        #region Methods        ///         /// 对字符串解析        ///         ///         /// 
public static DynamicXml Parse(string xmlString) { var xml = XDocument.Load(xmlString); xml.Root.Descendants().Attributes().Where(x => x.IsNamespaceDeclaration).Remove(); foreach (var elem in xml.Descendants()) elem.Name = elem.Name.LocalName; return new DynamicXml(xml.Root); } /// /// 对路径解析 /// /// ///
public static DynamicXml Load(string filename) { var xml = XDocument.Load(filename); xml.Root.Descendants().Attributes().Where(x => x.IsNamespaceDeclaration).Remove(); foreach (var elem in xml.Descendants()) { elem.Name = elem.Name.LocalName; RemoveAllNamespaces(elem); } return new DynamicXml(xml.Root); } /// /// 移除命名空间 /// /// ///
private static XElement RemoveAllNamespaces(XElement xmlDocument) { if (!xmlDocument.HasElements) { XElement xElement = new XElement(xmlDocument.Name.LocalName); xElement.Value = xmlDocument.Value; foreach (XAttribute attribute in xmlDocument.Attributes()) xElement.Add(attribute); return xElement; } return new XElement(xmlDocument.Name.LocalName, xmlDocument.Elements().Select(el => RemoveAllNamespaces(el))); } /// /// 重写获取成员 /// /// /// ///
public override bool TryGetMember(GetMemberBinder binder, out object result) { result = null; var att = _root.Attribute(binder.Name); if (att != null) { result = att.Value; return true; } var nodes = _root.Elements(binder.Name); if (nodes.Count() > 1) { result = nodes.Select(n => new DynamicXml(n)).ToList(); return true; } var node = _root.Element(binder.Name); if (node != null) { if (node.HasElements) { result = new DynamicXml(node); } else { result = node.Value; } return true; } return true; } #endregion }

另外一是对HTML代码进行选择如下:

public class QueryHtmlNode    {        public void Go()        {            WebClient client = new WebClient();                       MemoryStream ms = new MemoryStream(client.DownloadData("http://www.44woool.com/"));            HtmlDocument doc = new HtmlDocument();            doc.Load(ms, Encoding.GetEncoding("gb2312"));            var trs = doc.DocumentNode.SelectNodes("//tr").Where(it => null != it.Attributes["bgColor"] && it.Attributes["bgColor"].Value.Equals("#FFFF99")).ToList();            foreach (var tr in trs)            {                Console.WriteLine(new string('#', 50));                #region --- 特定一些数据 ---                //if (null != tr.SelectSingleNode("td/font"))                //{                //    //时间                //    Console.WriteLine(tr.SelectSingleNode("td/font").InnerText);                //}                //if (null != tr.SelectSingleNode("td[2]/a[@href]"))                //{                //    //链接                //    Console.WriteLine(tr.SelectSingleNode("td[2]/a[@href]").Attributes["href"].Value);                //}                 #endregion                #region --- 所有 ---                //foreach (var td in tr.SelectNodes("td"))                //{                //    Console.WriteLine(td.InnerText);                //    foreach (var a in tr.SelectNodes("td/a[@href]"))                //    {                //        Console.WriteLine(a.InnerText + "---------" + a.Attributes["href"].Value);                //    }                //}                #endregion                #region --- 按列取数据 ---                var tds = tr.SelectNodes("td");                for (int i = 0; i < tds.Count; i++)                {                    switch (i)                    {                        case 0:                            Console.WriteLine("服务器名称:" + tds[i].InnerText);                            if (null != tds[i].SelectSingleNode("a[@href]"))                            {                                Console.WriteLine("URL:" + tds[i].SelectSingleNode("a[@href]").Attributes["href"].Value);                            }                            break;                        case 2:                            Console.WriteLine("开放时间:" + tds[i].InnerText);                            break;                        case 4:                            Console.WriteLine("版本介绍:" + tds[i].InnerText);                            break;                        case 5:                            Console.WriteLine("QQ:" + tds[i].InnerText);                            break;                        default:                            break;                    }                }                #endregion            }            Console.WriteLine(trs.Count());        }    }

 

转载地址:http://zelya.baihongyu.com/

你可能感兴趣的文章
老男孩教育每日一题-第107天-简述你对***的理解,常见的有哪几种?
查看>>
Python学习--time
查看>>
在OSCHINA上的第一篇博文,以后好好学习吧
查看>>
luov之SMTP报错详解
查看>>
软件概要设计做什么,怎么做
查看>>
dwr
查看>>
java的特殊符号
查看>>
word2010中去掉红色波浪线的方法
查看>>
fabric上下文管理器(context mangers)
查看>>
JQuery-EasyUI Datagrid数据行鼠标悬停/离开事件(onMouseOver/onMouseOut)
查看>>
并发和并行的区别
查看>>
php小知识
查看>>
Windows下安装、运行Lua
查看>>
Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解(二)
查看>>
初识中间件之消息队列
查看>>
MyBatis学习总结(三)——优化MyBatis配置文件中的配置
查看>>
Spring常用注解
查看>>
我的友情链接
查看>>
PCS子层有什么用?
查看>>
查看端口,关闭端口
查看>>