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-16 06:04:52

TinyXmlParser开源喽的相关文章

TinySpider开源喽

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

TinyHtmlParser开源喽

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

爆料喽!!!开源日志库Logger的使用秘籍

导读 日志对于开发来说是非常重要的,不管是调试数据查看.bug问题追踪定位.数据信息收集统计,日常工作运行维护等等,都大量的使用到.今天介绍著名开源日志库Logger的使用,库的地址:https://github.com/orhanobut/logger 在Android Studio中的gradle中加入,就可以引用依赖logger库: dependencies { compile 'com.orhanobut:logger:1.15' } Logger库能提供的功能: 线程的信息 类的信息

GitHub 开源工具整理

技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 infoq:企业级应用,关注软件开发领域 OSChina:开源技术社区,开源方面做的不错哦 cnblogs,51cto,csdn:常见的技术社区,各有专长 stackoverflow:IT技术问答网站 GitHub:全球最大的源代码管理平台,很多知名开源项目都在上面,如Linux内核, OpenStack等免费的it电子书:http://

开源一个自己写的APP:装哔指南-记车标

想想我做安卓开发到现在也快两年了,所在的公司基本都是在做企业内部应用,自己每次做的一些小应用,都是做到一半或者快完成的时候放着积灰了.感觉很没有成就感啊!这两天心血来潮写了一个小应用:装哔指南-记车标 ,(花了两天,其中一天在搜集车标数据弄数据库 0.0 )顺便发出来给一些新手们学习学习(我也新手=.=   大神请绕道.) 下面简单介绍一下应用里面用到的知识点: 1. android SQLite 的简单使用. 2. listview和gridview 配合 BaseAdapter的使用方法.

NodeJs随心学习(一)之UEditor开源项目部署

作为NodeJs的初学者+6年的码农,我觉得从基础看起太慢了,还是直接上Demo好玩一些. 嗯,直接开玩..今天在GitHub上看到了UEditor之NodeJs版的开源项目激起了我浓厚的兴趣,随后决定部署一下,玩一玩[先上项目,再看语法~] 1.NodeJs环境当然必不可少喽~[不知道的同学请去搜基础教程,就是个安装嘛..] 2.安装UEditor模块~ 3.当然,从GitHub上下载的源码必不可少[https://github.com/netpi/ueditor] hello.js是我测试的

几个开源分词系统所使用标注集的来源

http://www.hankcs.com/nlp/corpus/several-revenue-segmentation-system-used-set-of-source-tagging.html 我发现几个民间的分词项目的词典很乱,ansj分词的作者承认arrays.dic是从结巴分词抄过来的,结巴的作者说词典是98年人民日报+ictclas切割小说统计出来的,那么可以推断这两个分词的标注集应该和ictclas是一样的. 按照ictclas的官方说法,其采用的标注集是ICTPOS3.0词性

如何用 Android Studio 导入开源项目以及常见错误的解决办法

声明:这篇文章完全来自这篇文章,感谢大神的相助.这篇文章纯粹是为了备份. 本篇以Github上最热门的MaterialDesign库,MaterialDesignLibrary来介绍怎样使用Android Sudio导入开源项目的,如果你和我一样刚刚从Eclipse转到AS,那本篇文章非常适合你. 如果不引入任何第三方库,不做自动化分渠道打包等操作,那可以在完全不了解Gradle的情况下进行Android项目的开发.但如果要想导入Github上的热门项目,必须首先熟悉Gradle. 1. Gra

微微信.NET:开源的ASP.NET微信公众号应用平台

题记: 平时喜欢使用 C# 编程,近半年玩微信公众平台,看到一些微信的应用系统大多是PHP.Python的,于是就有想法做一套开放的 C# ASP.NET的微信应用系统. 微微信.NET  基于ASP.NET的开源微信应用平台  --(面向客户完全开源 永久免费代码更新 游戏和点餐菜单正在完善中 很多功能继续优化) 微微信.NET  系统设计架构         本系统基于文件系统和内存数据库,标准板运行于.NET4,完全版需要单独的服务器或者VPS支持          本系统是一个开源系统,