优点: 高效、简单、易用的Xml解析器。
学习时间,分分钟。
支持中文标签名与属性名,支持下划线,减号等分隔符。
解析速度超过,查找速度超快,支持格式化。
缺点:不支持Xml Schema,DTD校验。
Maven引用坐标:
1 2 3 4 5 |
<dependency> < groupId>org.tinygroup</groupId> < artifactId>xmlparser</artifactId> < version>0.0.12</version> < /dependency> |
解析下面xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?xml version="1.0"?> < students> <student> <name>John</name> <grade>B</grade> <age>12</age> </student> <student> <name>Mary</name> <grade>A</grade> <age>11</age> </student> <student> <name>Simon</name> <grade>A</grade> <age>18</age> </student> < /students> |
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class TestXmlParser { public static void main(String[] args) throws Throwable { File file = new File("E:/test/students.xml "); XmlStringParser parser = new XmlStringParser(); XmlDocument document = parser.parse(IOUtils.readFromInputStream( new FileInputStream(file), "utf-8")); printStudents(document.getRoot()); } private static void printStudents(XmlNode studentsNode) { for(XmlNode studentNode:studentsNode.getSubNodes("student")){ printStuent(studentNode); } } private static void printStuent(XmlNode studentNode) { printSubTagByName(studentNode,"name"); printSubTagByName(studentNode,"grade"); printSubTagByName(studentNode,"age"); } private static void printSubTagByName(XmlNode studentNode,String tagName) { System.out.println( studentNode.getSubNode(tagName).getContent()); } } |
格式化示例:
1 2 3 4 5 |
XmlDocument doc; doc = new XmlStringParser() .parse("<html 中=‘文‘><head><title>aaa</title></head></html>"); XmlFormater f = new XmlFormater(); System.out.println(f.format(doc)); |
运行结果:
1 2 3 4 5 6 7 |
<html 中="文"> <head> <title> aaa </title> </head> < /html> |
性能测试: 构建下面的节点规模:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
HtmlNode node = null;
public NameFilterTest() { |
也就是节点数60+60*60+60*60*60个节点数时,进行下面的查找:
1 2 3 4 5 6 7 8 9 10 11 |
long t21 = System.currentTimeMillis(); FastNameFilter fast = new FastNameFilter(node); long t22 = System.currentTimeMillis(); System.out.println("fast初始化用时" + (t22 - t21)); long t1 = System.currentTimeMillis(); String nodeName = null; for (int x = 0; x < 10000; x++) { nodeName = fast.findNode("b6").getNodeName(); } long t2 = System.currentTimeMillis(); System.out.println("FastNameFilter用时" + (t2 - t1)); |
运行结果:
1 2 |
fast初始化用时130 FastNameFilter用时39 |
也就是说在219661个节点规模下,查找指定节点10000次,只用时39ms,还有比这个更快的么? 如果到此为止,其实也没有啥,它提供的过滤功能可以满足绝大多数的应用场景,先看看接口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
public interface NodeFilter<T extends Node<T>> { /** * 初始化节点 * * @param node */ void init(T node); /** /** /** /** /** /** /** /** /** void setExcludeByNode(String... excludeByNode); /** /** void setExcludeNode(String... excludeNode); /** /** /** /** /** /** /** /** |
从上面的接口,就可以看到,它支持属性及属性值过滤,支持属性名过滤,支持排除性名过滤,包含的文本过滤,包含的节点名过滤,被节点包含的名字过滤,排除子节点名过滤,至少包含一个节点名过滤,至少包含一个属性过滤,节点名过滤,这些过滤条件是可以组合使用的。
有了这么强大的节点过滤功能,程序员们对于Xml的使用就简单便捷多了。