记录下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] Ubuntu修改时区
sudo apt-get install sysv-rc-confsudo dpkg-reconfigure tzdata
- SQL SEREVR IO
Designing High Performance I/O Systems for SQL Server https://sqlbits.com/Downloads/86/Designing%20I ...
- You have JVM property "https.proxyHost" set to “localhost”
Mac下Pycharm和AndroidStudio里面proxy配置页都提示这个,后来在~/.gradle/gradle.properties里面找到了proxy设置代码,删掉就好了.
- 找不到编译动态表达式所需的一种或多种类型。是否缺少对 Microsoft.CSharp.dll 和 System.Core.dll 的引用?
提示“找不到编译动态表达式所需的一种或多种类型.是否缺少对 Microsoft.CSharp.dll 和 System.Core.dll 的引用? ”错误 解决方法: 将引入的COM对象(misc ...
- vue2.0的学习
vue-router 除了使用 <router-link> 创建 a 标签来定义导航链接,我们还可以借助 router 的实例方法,通过编写代码来实现. 1)router.push(loc ...
- 使用mybatisplus实现动态路由
1.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...
- rm: cannot remove `dir': Device or resource busy解决办法
使用df查看系统发现: [ops@bs038 cm-5.4.0]$ df -hFilesystem Size Used Avail Use% Mounted on/dev/sda3 1.1T 200G ...
- linux 基本配置tab键和显示行号 和中文输入法
一.仅设置当前用户的Tab键宽度 输入命令:vim ~/.vimrc 然后:set tabstop=4 //我这里将Tab键的宽度设置为4 保存:ctrl+z+z(或:wq!) OK! 二.设置所 ...
- mysql 修改表的字符集
修改表的字符集 88down voteaccepted If you want to change the table default character set and all character ...
- bootstrap内容太多表格撑破
增加样式 style="word-break:break-all; word-wrap:break-all;" 这样内容就会自动换行,表格就美观多了. <table cla ...