记录下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环境: 下载地址 相比以前 ...
随机推荐
- 使用 JavaScript 实现对 PDF 的全文索引
Mozilla实验室最近已经收到了许多为一个项目做出的尝试,这一项目的野心令人印象深刻:在一个浏览器中仅仅使用Javascript来对PDF进行渲染.PDF文档的结构令人难以置信的复杂,因此要祝pdf ...
- 每日英语:The Biggest Distraction In The Office Is Sitting Next To You
The big push in office design is forcing co-workers to interact more. Cubicle walls are lower, offic ...
- PairRDD中算子combineByKey图解
1.combineByKey combine 为结合意思. 作用: 将RDD[(K,V)] => RDD[(K,C)] 表示V的类型可以转成C两者可以不同类型. def combineBy ...
- VC++ 进度条的使用
进度条控件封装在CProcessCtrl类中 1.SetRange和SetRange32方法来设置进度条显示范围. 语法格式: void SetRange(short nLower, short nU ...
- 基于S3C2440的U-BOOT的start.S分析
基于S3C2440的U-BOOT的start.S分析 在了解了ARM相关的汇编指令后,同时结合网上各位大虾的提点开始阅读u-boot的启动代码,现将分析过程记录如下 可执行文件及内存映射 我们可以把可 ...
- LeetCode: Clone Graph 解题报告
Clone GraphClone an undirected graph. Each node in the graph contains a label and a list of its neig ...
- C#中WebBrowser控件的使用
今天在YouTube上看了一个关于WebBrowser控件用法的小视频,做一下总结. 首先创建一个WinForm程序,拖入一个textbox控件和一个button按钮,然后拖入一个panel控件,如图 ...
- Android几种layout(布局)的区别
1.FrameLayout:children按照从左上开始的顺序排列,主要用于tabed view或者图片切换功能:最简单的布局模型,在这种布局下每个添加的子控件都被放在布局的左上角,并覆盖在前一子控 ...
- iOS网络NSURLConnection使用详解
一.整体介绍 NSURLConnection是苹果提供的原生网络访问类,但是苹果很快会将其废弃,且由NSURLSession(iOS7以后)来替代.目前使用最广泛的第三方网络框架AFNetworkin ...
- java中常用的类,包,接口
类 StringIntegerLong File DateThread(java.lang.ThreadThread类的定义:public class Thread extends Object im ...