不一样的味道--Html和Xml解析、格式、遍历
很多其它内容查看官网:http://www.tinygroup.org
TinyXmlParser一切以简单、有用、高速为主。
演示样例1:Xml字符串解析
比方,我们要解析一段Xml字符串,简单例如以下就可以:
XmlDocument xmlDocument = new XmlStringParser().parse("<title><a>a</a></title>");
演示样例2:输出格式化后的Xml:
XmlFormater formater = new XmlFormater();
System.out.println(formater.format(xmlDocument));
执行结果例如以下:
<title>
<a>a</a>
</title>
当然换一种写法也是能够的。比方以下:
XmlDocument xmlDocument = new XmlStringParser().parse("<title><a>a</a></title>");
XmlFormater formater = new XmlFormater();
formater.format(xmlDocument,System.out));
输出结果和上面是一样的。
演示样例3:中文标签支持
XmlDocument document = new XmlStringParser().parse("<html 中='文'><head><title>aaa</title><中>中信</中></head></html>");
document.write(System.out);
XmlFormater formater = new XmlFormater();
formater.format(document, System.out);
上面的样例用了两种方式,一种是非格式化方式输出。默认是用一行输出的;还有一种是格式化输出的:
<html 中="文"><head><title>aaa</title><中>中信</中></head></html>
<html 中="文">
<head>
<title>aaa</title>
<中>中信</中>
</head>
</html>
能够看到对于中文标签及属性也有完美支持。
演示样例4:容错性演示样例
XmlDocument document = new XmlStringParser().parse("<title><a>a</title>");
XmlFormater formater = new XmlFormater();
formater.format(document, System.out);
上面的样例中。<a> 标签没有</a>结束标签。
输出结果例如以下:
<title>
<a>a</a>
</title>
能够看到,它已经尽最大可能来推測是否正确
演示样例5:性能測试
XmlNode node = null;
public NameFilterTest() {
node = new XmlNode("root");
for (int i = 0; i < 60; i++) {
XmlNode a = node.addNode(new XmlNode("a" + i));
for (int j = 0; j < 60; j++) {
XmlNode b = a.addNode(new XmlNode("b" + j));
for (int k = 0; k < 60; k++) {
b.addNode(new XmlNode("c" + k));
}
}
}
}
构建这么大一棵Dom树
long t21 = System.currentTimeMillis();
FastNameFilter<XmlNode> fast = new FastNameFilter(node);
long t22 = System.currentTimeMillis();
System.out.println("初始化用时:" + (t22 - t21));
long t1 = System.currentTimeMillis();
for (int x = 0; x < 10000; x++) {
XmlNode node = fast.findNode("b6");
}
// System.out.println(nodeName);
long t2 = System.currentTimeMillis();
System.out.println("遍历用时:" + (t2 - t1));
执行结果例如以下:
初始化用时:48
遍历用时:20
请注意。上面的时间单位不是分钟。不是秒钟。而是毫秒。
演示样例6:节点过滤
对节点过滤是否方便才是最紧要的。
这个功能,太过强大,因此。用样例已经演示不出它的强大了。
直接贴接口:
public interface NodeFilter<T extends Node<T>> {
/**
* 初始化节点
*
* @param node
*/
void init(T node);
/**
* 设置必须包括的属性及相应属性的值,必须存在
*
* @param includeAttributes
*/
void setIncludeAttribute(Map<String, String> includeAttributes);
/**
* 设置必须包括的属性及相应的属性的值。必须存在
*
* @param key
* @param value
*/
void setIncludeAttribute(String key, String value);
/**
* 设置必须包括的属性
*
* @param includeAttribute
*/
void setIncludeAttributes(String... includeAttribute);
/**
* 设置必须排除的属性及相应属性值 假设包括属性,但属性的值与Map中不同样。同意存在该属性 若包括属性且属性的值与Map中同样,则不同意存在该属性
*
* @param excludeAttribute
*/
void setExcludeAttribute(Map<String, String> excludeAttribute);
/**
* 设置必须排除的属性。指定的属性不能存在
*
* @param excludeAttribute
*/
void setExcludeAttribute(String... excludeAttribute);
/**
* 设置必须包括的内容,仅仅须要context中包include该值即可
*
* @param includeText
*/
void setIncludeText(String... includeText);
/**
* 设置必须排除的内容
*
* @param excludeText
*/
void setExcludeText(String... excludeText);
/**
* 设置必须包括的子节点
*
* @param includeNode
*/
void setIncludeNode(String... includeNode);
/**
* 设置父节点不同意的节点名称
*
* @param excludeByNode
*/
void setExcludeByNode(String... excludeByNode);
/**
* 设置父节点必须包括的节点名称
*
* @param includeByNode
*/
void setIncludeByNode(String... includeByNode);
/**
* 设置必须排除的子节点
*
* @param excludeNode
*/
void setExcludeNode(String... excludeNode);
/**
* 设置至少包括一个指定名称的节点
*
* @param xorSubNode
*/
void setXorSubNode(String... xorSubNode);
/**
* 设置至少包括一个指定名称属性
*
* @param xorProperties
*/
void setXorProperties(String... xorProperties);
/**
* 清除过滤条件
*/
void clearCondition();
/**
* 设置要搜索的节点名称
*/
void setNodeName(String nodeName);
/**
* 查找指定节点名称及满足其它条件的节点列表
*
* @param nodeName
* @return
*/
List<T> findNodeList(String nodeName);
/**
* 依据名字及其它条件查找节点,假设有多个,也仅仅返回第一个
*
* @param nodeName
* 要查找的节点名称
* @return
*/
T findNode(String nodeName);
/**
* 搜索符合设置的节点名称的节点,假设有多个,则仅仅返回找到的第一个
*
* @return
*/
T findNode();
/**
* 搜索符合设置的节点名称的节点列表
*
* @return
*/
List<T> findNodeList();
}
也就是说它支持节点指定属性名及指定属性值过滤(能够指定多组)、指定属性名过滤(无论是什么值都能够。能够指定多个)、能够指定排除属性及属性值(即不能包括的属性名及值,能够包括多组)、不能包括的属性(能够包括多组)、包括文本内容(能够指定多组)、不能包括的文件内容(能够指定多组),能够指定包括的节点名(能够指定多组)、能够指定不能包括的节点(能够指定多组)、能够指定必须在某个节点下(能够指定多组)、能够指定不能在某个节点下(能够指定多组)、能够指定至少包括某几个节点中的一个,能够指定至下包括某几个属性中的一个,能够依据节点名进行搜索。
上面的全部条件能够组合起来一起搜索。
说了这么多。看看測试用例:
node = new XmlNode("root");
XmlNode n1 = node.addNode(new XmlNode("aa"));
n1.setAttribute("a", "av");
n1.setAttribute("b", "bv");
n1.addNode(new XmlNode("a"));
n1 = node.addNode(new XmlNode("aa"));
n1.setAttribute("a", "av1");
n1.setAttribute("b", "bv1");
n1.setAttribute("c", "cv1");
n1.addNode(new XmlNode("b"));
上面构建了一棵Dom树:
<root>
<aa a="av" b="bv">
<a>
</a>
</aa>
<aa a="av1" b="bv1" c="cv1">
<b>
</b>
</aa>
</root>
以下是一堆的測试用例了:
filter = new NameFilter(node);
filter.clearCondition();
assertEquals(1, filter.findNodeList("root").size());
filter.setExcludeAttribute("c");
assertEquals(1, filter.findNodeList("aa").size());
// 測试包括属性名
filter.clearCondition();
assertEquals(1, filter.findNodeList("root").size());
filter.setIncludeAttributes("c");
assertEquals(1, filter.findNodeList("aa").size());
// 測试包括指定属性值
filter.clearCondition();
Hashtable<String, String> pht = new Hashtable<String, String>();
pht.put("a", "av1");
filter.setIncludeAttribute(pht);
assertEquals(1, filter.findNodeList("aa").size());
filter.setExcludeAttribute("c");
assertEquals(0, filter.findNodeList("aa").size());
// 測试包括指定节点
filter.clearCondition();
filter.setIncludeNode("a");
assertEquals(1, filter.findNodeList("aa").size());
filter.setIncludeAttributes("c");
assertEquals(0, filter.findNodeList("aa").size());
// 測试包括指定节点
filter.clearCondition();
filter.setExcludeNode("c");
assertEquals(2, filter.findNodeList("aa").size());
測试用例写得比較丑,可是对它的使用还是做了一个简单的演示。
上面全部的样例其中,把X变成Ht,就是针对Html解析器的了,API全然一致,使用方法全然同样。
差别在于Xml的标签及属性名是大写和小写敏感的,而Html是大写和小写不敏感的。
其他Html支持单标签。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
不一样的味道--Html和Xml解析、格式、遍历的更多相关文章
- xml解析-jaxp遍历结点
jaxp遍历结点 把xml中所有的结点都打印出来 // 遍历结点把所有元素名称打印出来 / 1.创建解析器工厂 * 2.根据解析器工厂创建解析器 * 3.解析xml返回document * * 4.得 ...
- iOS XML解析使用-韩国庆
欢迎-------(北京-iOS移动开发金牌教师QQ:2592675215)韩老师给你带来XML解析课程 今天给大家讲解下xml解析的第三方简单用法:首先我解释下,json和xml解析格式. JSON ...
- xml解析技术
本文总结Dom,sax解析, 使用Java作为工具解析xml文档. 1 Dom 综述:Dom解析xml通常也称为xmlDom (和htmlDom技术差不多),将xml文档封装成树,好处就是xml中的 ...
- Duilib源码分析(三)XML解析器—CMarkup
上一节介绍了控件构造器CDialogBuilder,接下来将分析其XML解析器CMarkup: CMarkup:xml解析器,目前内置支持三种编码格式:UTF8.UNICODE.ASNI,默认为UTF ...
- JSON解析和XML解析对比
JSON解析和XML解析是较为普遍的两种解析方式,其中JSON解析的市场分额更大.本文系统的分析两种解析方式的区别,为更好地处理数据作准备.由于目前阶段主要是做移动开发,所以本文所描述的JSON解析和 ...
- 【Android】实现XML解析的几种技术
本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...
- 定位和xml解析和gson解析加上拉加载,下拉刷新
这里的上拉加载,下拉刷新用到是依赖包 Mainactivity,xml解析和定位 package com.exmple.autolayout; import java.util.List; impor ...
- tinyxml一个优秀的C++ XML解析器
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解 ...
- PERL/LEX/YACC技术实现文本解析--XML解析
继周六的p_enum.pl后,再来一篇说说我用perl做的lex,yacc工具.之前说了,我学习lex和yacc的最初动机是为了做个C语言解释器的SHELL:但后来工作中的实际需要也是制作perl版l ...
随机推荐
- poj3206(bfs+最小生成树)
传送门:Borg Maze 题意:有一个迷宫,里面有一些外星人,外星人用字母A表示,#表示墙,不能走,空格可以走,从S点出发,在起点S和A处可以分叉走,问找到所有的外星人的最短路径是多少? 分析:分别 ...
- 解决IE11无法下载文件的问题
[问题描写叙述] 单击IE底部下载工具栏没反应,点击"另存为"也没反应 [解决方法] 打开IE11,依次打开菜单:Internet 选项 -> 高级 -> 重置,重置完 ...
- 【足迹C++primer】30、概要(泛型算法)
概要(泛型算法) 大多数算法的头文件中定义algorithm在. 标准库也是第一个文件numeric它定义了一套通用算法. #include<iostream> #include<n ...
- (转)一篇很不错的介绍Eclipse插件Menu及其扩展点的文章
原文在:http://tech.ddvip.com/2010-04/1271054623150507.html 菜单是各种软件及开发平台会提供的必备功能,Eclipse 也不例外,提供了丰富的菜单,包 ...
- Flash Android ANE打包之基本流程
搭建环境这里就不详细说明了 一.Android本地库编写 1.从Flash Air SDK中提取需要的jar包 Android下需要的jar包在Flash Air SDK/lib/android目录下 ...
- 在Java中如何使用jdbc连接Sql2008数据库(转)
我们在javaEE的开发中,肯定是要用到数据库的,那么在javaEE的开发中,是如何使用代码实现和SQL2008的连接的呢?在这一篇文章中,我将讲解如何最简单的使用jdbc进行SQL2008的数据库的 ...
- eclipse3.1.1汉化版安装
确认安装好jdk以后,下载eclipse3.1.1及多语言包eclipse3.1.1 下载地址 http://eclipse.areum.biz/downloads/drops/R-3.1.1-2 ...
- 简单工厂 VS 工厂方法 VS 抽象工厂
说到设计模式.自然少不了简单工厂模式.工厂方法和抽象工厂这三姐妹. 它们之间可谓是各有所长,术业专攻啊!这篇博客来简单的梳理一下三者之间的关系. 那么工厂又是什么意思呢?结合三者的特点,我觉得能够这样 ...
- sscanf,sscanf_s及其相关使用方法
#include<stdio.h> 定义函数 int sscanf (const char *str,const char * format,........); 函数说明 sscan ...
- CentOS6.5解压缩文件.tar.gz .war .zip
拉开拉链.tar.gz文件: tar -zxvf web.tar.gz tar将文件解压缩到一个指定的文件夹. 拉开拉链.war .zip文件到指定的文件夹: unzip web.war -d web ...