之前解析都是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 使用方式的更多相关文章

  1. 记录下一个C++初始化的方式(很少有人这么用,但是却是一个使代码更加简洁的方式)

    很多时候,在一个类创建的时候给它初始化,一般呢,99%的人都会这么用: //A.h Class CA { int a; char* p; int getValue(); }; //A.cpp CA:: ...

  2. NetFlow是一种数据交换方式,提供网络流量的会话级视图,记录下每个TCP/IP事务的信息

    NetFlow是一种数据交换方式,提供网络流量的会话级视图,记录下每个TCP/IP事务的信息.也许它不能象tcpdump那样提供网络流量的完整记录,但是当汇集起来时,它更加易于管理和易读.Netflo ...

  3. Java JDBC下执行SQL的不同方式、参数化预编译防御

    相关学习资料 http://zh.wikipedia.org/wiki/Java数据库连接 http://lavasoft.blog.51cto.com/62575/20588 http://blog ...

  4. 记录下Webapi签名机制

    首先,写这篇文章的原因是因为最近某一个项目中的接口被人为调用了,导致了数据库数据被串改.虽然是内部人无意点的,但还是引起了我的担忧,所有整理了下关于Webapi的相关签名机制. 一.我们在开发接口时, ...

  5. 记录下项目中常用到的JavaScript/JQuery代码二(大量实例)

    记录下项目中常用到的JavaScript/JQuery代码一(大量实例) 1.input输入框监听变化 <input type="text" style="widt ...

  6. 记录下项目中常用到的JavaScript/JQuery代码一(大量实例)

    一直没有系统学习Javascript和Jquery,每次都是用到的时候去搜索引擎查,感觉效率挺低的.这边把我项目中用的的记录下,想到哪写哪,有时间再仔细整理. 当然,由于我主要是写后端java开发,而 ...

  7. Linux下重要日志及查看方式

    1.Linux下重要日志文件介绍 /var/log/boot.log 该文件记录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息,如图1所示: 图1 /var/log/boot. ...

  8. centos7.x下环境搭建(一)--yum方式安装mysql5.7

    前两天因为数据库被黑客攻击,导致数据被删除,数据库被损坏,系统重新安装了一下,所以环境也需要重新再搭一遍,包括mysql.nodejs.git.nginx和redis的安装.由于之前安装的mysql安 ...

  9. 随便记录下系列 - node->express

    随便记录下系列 - node->express 文章用啥写?VsCode. 代码用啥写?VsCode. 编辑器下载:VsCode 一.windows下安装node.js环境: 下载地址 相比以前 ...

随机推荐

  1. 使用 JavaScript 实现对 PDF 的全文索引

    Mozilla实验室最近已经收到了许多为一个项目做出的尝试,这一项目的野心令人印象深刻:在一个浏览器中仅仅使用Javascript来对PDF进行渲染.PDF文档的结构令人难以置信的复杂,因此要祝pdf ...

  2. 每日英语: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 ...

  3. PairRDD中算子combineByKey图解

    1.combineByKey combine 为结合意思.    作用: 将RDD[(K,V)] => RDD[(K,C)] 表示V的类型可以转成C两者可以不同类型. def combineBy ...

  4. VC++ 进度条的使用

    进度条控件封装在CProcessCtrl类中 1.SetRange和SetRange32方法来设置进度条显示范围. 语法格式: void SetRange(short nLower, short nU ...

  5. 基于S3C2440的U-BOOT的start.S分析

    基于S3C2440的U-BOOT的start.S分析 在了解了ARM相关的汇编指令后,同时结合网上各位大虾的提点开始阅读u-boot的启动代码,现将分析过程记录如下 可执行文件及内存映射 我们可以把可 ...

  6. LeetCode: Clone Graph 解题报告

    Clone GraphClone an undirected graph. Each node in the graph contains a label and a list of its neig ...

  7. C#中WebBrowser控件的使用

    今天在YouTube上看了一个关于WebBrowser控件用法的小视频,做一下总结. 首先创建一个WinForm程序,拖入一个textbox控件和一个button按钮,然后拖入一个panel控件,如图 ...

  8. Android几种layout(布局)的区别

    1.FrameLayout:children按照从左上开始的顺序排列,主要用于tabed view或者图片切换功能:最简单的布局模型,在这种布局下每个添加的子控件都被放在布局的左上角,并覆盖在前一子控 ...

  9. iOS网络NSURLConnection使用详解

    一.整体介绍 NSURLConnection是苹果提供的原生网络访问类,但是苹果很快会将其废弃,且由NSURLSession(iOS7以后)来替代.目前使用最广泛的第三方网络框架AFNetworkin ...

  10. java中常用的类,包,接口

    类 StringIntegerLong File DateThread(java.lang.ThreadThread类的定义:public class Thread extends Object im ...