很多其它内容查看官网: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支持单标签。
版权声明:本文博客原创文章,博客,未经同意,不得转载。