TinyXmlParser开源喽~~~

优点:

高效、简单、易用的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() {

        node = new HtmlNode("root");

        for (int i = 0; i < 60; i++) {

            HtmlNode a = node.addNode(new HtmlNode("a" + i));

            for (int j = 0; j < 60; j++) {

                HtmlNode b = a.addNode(new HtmlNode("b" + j));

                for (int k = 0; k < 60; k++) {

                    b.addNode(new HtmlNode("c" + k));

                }

            }

        }

    }

也就是节点数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);

 

    /**

     * 设置必须包含的属性及对应属性的值,必须存在

     *

     * @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();

}

从上面的接口,就可以看到,它支持属性及属性值过滤,支持属性名过滤,支持排除性名过滤,包含的文本过滤,包含的节点名过滤,被节点包含的名字过滤,排除子节点名过滤,至少包含一个节点名过滤,至少包含一个属性过滤,节点名过滤,这些过滤条件是可以组合使用的。

有了这么强大的节点过滤功能,程序员们对于Xml的使用就简单便捷多了。

时间: 2024-10-25 13:37:24

TinyXmlParser开源喽~~~的相关文章

TinyDbRouter开源喽~~~

前面有过一篇文章介绍TinyDbRouter,但是当时没有开出来,主要原因是:1偶的粉丝数太少,期望到100的时候,纪念性的发布这个重量级框架,另外一个原因是当时有个编译问题没有完美的解决,偶担心同学们使用的时候不方便--其实偶也不方便,尤其是发布和测试的时候. 现在粉够100了,那个编译问题也顺利的解决了,OK,没有什么理由不快些把它开放给大家. 前面偶起的名字是TinyDBCluster,后来由于有同学们反应说这个与数据库集群歧义,因此还是改成TinyDBRouter了,如果看到两个名字,请

TinySpider开源喽~~~

TinySpider是一个基于Tiny HtmlParser的网络数据抓取框架. Maven引用坐标: ? 1 2 3 4 5 <dependency> <groupId>org.tinygroup</groupId> <artifactId>tinyspider</artifactId> <version>0.0.12</version> </dependency> 网络爬虫,一般用在全文检索或内容获取上面.

TinyHtmlParser开源喽~~~

优点: 高效.简单.易用的Html解析器. 学习时间,分分钟. 解析速度超过,查找速度超快,支持格式化. 有强悍的容错性,即使HTML标签不规范,也会尽可以进行匹配,弥补,正确纠错率达95%以上.即使不能正确纠错,也不会导致解析不下去. 支持大小写混合匹配,即开始标签与结束标签为<HTML>和</html>也可以正确的进行匹配. Maven引用坐标: 1 <dependency> 2 <groupId>org.tinygroup</groupId>

使用TinySpider实战抓取自己博客中的内容

因为做官网,没有内容,因此就想办法从OSChina中写的博客里弄点内容,这就要用到爬虫了. 然后就花了几分钟搞了一下,步骤如下: 第一步,写个方法抓目录: ? 1 2 3 4 5 6 7 8 9 10 11 public static void processCategory(String categoryId) {         Watcher watcher = new WatcherImpl();         Spider spider = new SpiderImpl();    

上个月全职工作(含加班费)18000,靠,加班费也要交税

问题描述 上个月全职工作(含加班费)18000,靠,加班费也要交税,一起交了2620的税,坑爹吖.上次哪个家伙说在北京7500要有安全感,算了吧?哥在上海,这个水平,我也没有安全感,还在一边做兼职赚钱,就是要赚钱.顺便说下,哥是86年的娃,一在家外企做IT软件开发.85后的,赚多少有安全感? 解决方案 解决方案二:其实我想交一亿元的税.只不过不给机会啊.解决方案三:上海待遇就是不错解决方案四:爷就是讨厌你这样的!有多少本事拿出来说说,扯蛋没用的.爷是在读博士,导师每月给生活费800,你18000

java开源项目研究 1. 引子

项目       一夜之间,开源项目仿佛无处不在,几乎覆盖了包括操作系统.网络通讯.桌面环境.教育.办公.安全.文字处理.数据库.中间件.应用娱乐在内的所有软件类型.在最大的开源项目发布平台www.sourceforge.net上,已经有近十万件开源项目,并且每天都有更多新的开源项目加入.而著名的www.apache.org则为大家奉献了Apache.Tomcat.Struts .Axis等.       开源运动是程序员对智慧成果共享.自由的追求,每天都有无数程序员为开源世界添砖加瓦,还有更多

java开源项目研究

项目 一夜之间,开源项目仿佛无处不在,几乎覆盖了包括操作系统.网络通讯.桌面环境.教育.办公.安全.文字处理.数据库.中间件.应用娱乐在内的所有软件类型.在最大的开源项目发布平台www.sourceforge.net上,已经有近十万件开源项目,并且每天都有更多新的开源项目加入.而著名的www.apache.org则为大家奉献了Apache.Tomcat.Struts .Axis等. 开源运动是程序员对智慧成果共享.自由的追求,每天都有无数程序员为开源世界添砖加瓦,还有更多的程序员在学习开源软件的

没有这个黑客 就没有开源软件

你的手机.你家的电视机顶盒.甚至你取款的 ATM,都是基于林纳斯·托瓦兹做的 Linux 系统改的.幸好他也是不收专利费. 他是谁:林纳斯·托瓦兹(Linus Torvalds,1969- ),他是开源系统 Linux 的创造者,一个热爱自由的黑客.你现在用的电子产品,或多或少都跟这个人做的操作系统有关系.好奇心:林纳斯·托瓦兹说,他的成功主要是因为他很懒,而且喜欢授权别人.这个认为娱乐价值高于商业的黑客,成了我们大部分科技产品的源头. 如果不是这位讨厌知识产权的黑客,我们现在的电脑.手机.电视

没有这个黑客,就不会有你现在用的开源软件

他是谁:林纳斯·托瓦兹(Linus Torvalds,1969- ),他是开源系统Linux的创造者,一个热爱自由的黑客.你现在用的电子产品,或多或少都跟这个人做的操作系统有关系. 好奇心:林纳斯·托瓦兹说,他的成功主要是因为他很懒,而且喜欢授权别人.这个认为娱乐价值高于商业的黑客,成了我们大部分科技产品的源头. 如果不是这位讨厌知识产权的黑客,我们现在的电脑.手机.电视机,甚至是 ATM 机都不会是现在这个样子--事实上,如果没有林纳斯·托瓦兹(Linus Torvalds)创造的 Linux