记录下DynamicXml和HtmlDocument 使用方式
之前解析都是XmlDocument.Load 而现在可以利用DynamicXml生成Dynamic对象实现强类型操作,很好用.
/// <summary>
/// 根据Xml路径动态解析成XML-Object
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
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
/// <summary>
/// 对字符串解析
/// </summary>
/// <param name="xmlString"></param>
/// <returns></returns>
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);
}
/// <summary>
/// 对路径解析
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
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);
}
/// <summary>
/// 移除命名空间
/// </summary>
/// <param name="xmlDocument"></param>
/// <returns></returns>
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)));
}
/// <summary>
/// 重写获取成员
/// </summary>
/// <param name="binder"></param>
/// <param name="result"></param>
/// <returns></returns>
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() > ) {
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('#', ));
#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 = ; i < tds.Count; i++)
{
switch (i)
{
case :
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 :
Console.WriteLine("开放时间:" + tds[i].InnerText);
break;
case :
Console.WriteLine("版本介绍:" + tds[i].InnerText);
break;
case :
Console.WriteLine("QQ:" + tds[i].InnerText);
break;
default:
break;
}
} #endregion
}
Console.WriteLine(trs.Count());
}
}
记录下DynamicXml和HtmlDocument 使用方式的更多相关文章
- 记录下一个C++初始化的方式(很少有人这么用,但是却是一个使代码更加简洁的方式)
很多时候,在一个类创建的时候给它初始化,一般呢,99%的人都会这么用: //A.h Class CA { int a; char* p; int getValue(); }; //A.cpp CA:: ...
- NetFlow是一种数据交换方式,提供网络流量的会话级视图,记录下每个TCP/IP事务的信息
NetFlow是一种数据交换方式,提供网络流量的会话级视图,记录下每个TCP/IP事务的信息.也许它不能象tcpdump那样提供网络流量的完整记录,但是当汇集起来时,它更加易于管理和易读.Netflo ...
- Java JDBC下执行SQL的不同方式、参数化预编译防御
相关学习资料 http://zh.wikipedia.org/wiki/Java数据库连接 http://lavasoft.blog.51cto.com/62575/20588 http://blog ...
- 记录下Webapi签名机制
首先,写这篇文章的原因是因为最近某一个项目中的接口被人为调用了,导致了数据库数据被串改.虽然是内部人无意点的,但还是引起了我的担忧,所有整理了下关于Webapi的相关签名机制. 一.我们在开发接口时, ...
- 记录下项目中常用到的JavaScript/JQuery代码二(大量实例)
记录下项目中常用到的JavaScript/JQuery代码一(大量实例) 1.input输入框监听变化 <input type="text" style="widt ...
- 记录下项目中常用到的JavaScript/JQuery代码一(大量实例)
一直没有系统学习Javascript和Jquery,每次都是用到的时候去搜索引擎查,感觉效率挺低的.这边把我项目中用的的记录下,想到哪写哪,有时间再仔细整理. 当然,由于我主要是写后端java开发,而 ...
- Linux下重要日志及查看方式
1.Linux下重要日志文件介绍 /var/log/boot.log 该文件记录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息,如图1所示: 图1 /var/log/boot. ...
- centos7.x下环境搭建(一)--yum方式安装mysql5.7
前两天因为数据库被黑客攻击,导致数据被删除,数据库被损坏,系统重新安装了一下,所以环境也需要重新再搭一遍,包括mysql.nodejs.git.nginx和redis的安装.由于之前安装的mysql安 ...
- 随便记录下系列 - node->express
随便记录下系列 - node->express 文章用啥写?VsCode. 代码用啥写?VsCode. 编辑器下载:VsCode 一.windows下安装node.js环境: 下载地址 相比以前 ...
随机推荐
- linux 打包为zip压缩包
[root@nb linux学习]# zip -r dir.zip dir文件夹/ file文件 adding: dir文件夹/ (stored %) adding: file文件 (deflated ...
- 简单的图形学(二)——材质与反射
在上一篇[游戏框架系列]简单的图形学(一)文章中,我们讲述了光线追踪的一个最简单的操作--依每个像素延伸出一条追踪光线,光线打到球上(产生交点),就算出这条线的长度,作为最终的灰度,打不到球上,就显示 ...
- Linux shell 执行修改配置文件中的内容
在开发的过程中可能Linux环境不一致需要适应本地环境的HOME目录,可以通过脚本来修改配置文件内容,写一个test.sh的脚本 在脚本里写入以下命令 sed -i “s#ftfts_com_serv ...
- python 列表的内容赋值
l1 = '20180201 b4b8e187-d59d-33fb-addc-ef189aca3712 com.ss.android.article.news' l2 = re.split('[ ]+ ...
- python学习笔记(22)--漫画生成html最终版
说明(2017.3.14): 1. 在主文件夹生成一个main.html作为目录 2. 在每个子文件夹生成一个index.html作为看图网页 3. 通过python批量生成html网页,js配合进行 ...
- 一款基于jquery固定于顶部的导航
今天给大家分享一款基于jquery固定于顶部的导航,这款导航当浏览器滚动条位于顶部时,导航高度较高,当浏览器滚动向下滚动时,导航高度自动减低,并位于顶部.效果图如下: 在线预览 源码下载 实现的代 ...
- java 关于同步异步的理解
经常看到介绍 ArrayList 和HashMap是异步,Vector和HashTable是同步,这里同步是线程安全的,异步不是线程安全的,举例说明: 当创建一个Vector对象时候, Vector ...
- 如何在linux下实现mysql数据库每天自动备份
建备份文件夹: mkdir mysql_data_bak 建脚本文件: touch autobackupmysql.sh 打开文件 vi autobackupmysql.sh 在脚本中加入如下内容: ...
- UVALive-4670 AC自动机入门题 求出现次数最多的子串
/** 链接:http://vjudge.net/problem/UVALive-4670 详见lrj训练指南P216 */ #include<bits/stdc++.h> using n ...
- easyUI datagrid 排序
easyUI datagrid 排序 1.首先设置datagrid属性sortName 2.设置sortOrder 3.设置remoteSort(注:此属性默认为true,如果如果是对本地数据排序必须 ...