记录下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环境: 下载地址 相比以前 ...
随机推荐
- Python之Dijango的“坑” hostname, aliases, ipaddrs = gethostbyaddr(name) UnicodeDecodeError: 'utf-8' cod
错误代码提示: hostname, aliases, ipaddrs = gethostbyaddr(name) UnicodeDecodeError: 'utf-8' codec can't dec ...
- [转帖]Android平台下OpenGL初步
原文请看 Android平台下OpenGL初步 本文只关注于如何一步步实现在Android平台下运用OpenGl. 1.GLSurfaceView GLSurfaceView是Android应用程序中 ...
- dubbo注册zookeeper保错原因
我的zookeeper是安装在本地,用的默认端口2181,版本3.4.10.dubbo版本2.5.8.dubbo-demo-provider.xml配置文件修改为:<dubbo:registry ...
- SQL Server FOR XML PATH 语句的应用---列转行
经常在论坛看到高手使用了 for xml path,由于是搜索一下,记录了详细的使用方法.在SQL Server中利用 FOR XML PATH 语句能够把查询的数据生成XML数据,下面是它的一些应用 ...
- DMA2D 图形加速器简介
在实际使用 LTDC 控制器控制液晶屏时,使 LTDC 正常工作后,往配置好的显存地址写入要显示的像素数据, LTDC 就会把这些数据从显存搬运到液晶面板进行显示,而显示数据的容量非常大,所以我们希望 ...
- Qt学习之路2---窗口组件及窗口类型
窗口组件: 图形用户界面由不同的窗口和窗口组件构成: Qt以组件对象的方式,构建图形用户界面. 组件的类型包括: ---容器类(父组件):用于包含其他的界面组件 ---功能类(子组件):用于实现特定的 ...
- java.lang.ClassNotFoundException: com.sun.image.codec.jpeg.JPEGCodec
今天迁移老项目到linux服务器,jdk8 ,tomcat8.5遇到这个问题. java.lang.ClassNotFoundException: com.sun.image.codec.jpeg.J ...
- [DNS]部署局域网DNS服务器
This is a step by step tutorial on how to install and configure DNS server for your LAN using bind9. ...
- 4G模块ME3760_V2 端口映射
/dev/ttyUSB0 ECM // ECM 口 /dev/ttyUSB1 / //ECM口 /dev/ttyUSB2 AT ...
- zip文件内存中解压读取
// 构造zip输入流 ZipInputStream zip = new ZipInputStream(fis,Charset.forName("gbk")); byte[] tm ...