[造轮光荣] 吹牛:我写的xml解析器,可能是这个世界上最快的了。。。
by
at 2011-03-01 14:44:47
original http://www.javaeye.com/topic/935613
解析超级简单。 XmlTree tree=XmlParser.parse(String xml);
返回一个树对象, 是一个树形数据结构,使用就是比ArrayList复杂那么一点点..
(XmlTree对象的使用方式 :http://www.javaeye.com/topic/935876)
可能对下面的代码有点疑惑 ,有个Xml.parserXml(xml); 还有个XmlParser.parse(xml),
前一个使用的是jdk官方解析包, 后一个是自己写的。 两个解析后返回对象完全相同。
对比速度,经过多次测试,几乎任何xml解析速度都快 4-5倍, 下的xml重复解析1万此,
耗时400毫秒(我的机器,cpu 1.6G,intel)。
import java.util.List;import org.open4j.io.Reader; import org.open4j.nxml.XmlParser; import org.open4j.xml.Xml; import org.open4j.xml.XmlNode; import org.open4j.xml.XmlTree;
public class TestXml {
public static void main(String[] args) { String xml=Reader.loadFileUtf("d://test.xml"); Xml.parseXml(xml); XmlParser.parse(xml); XmlTree tree=null; long d=System.currentTimeMillis(); /**** * 这个解析器,使用jdk官方解析器,解析完毕,返回XmlTree(自定义数据结构) 对象 */ for(int i=0;i<10000;++i){ tree=Xml.parseXml(xml); } System.out.println(System.currentTimeMillis()-d); /**** * 这个使用的自己写的解析器, 解析结果和上一个完全相同。 */ long d2=System.currentTimeMillis(); for(int i=0;i<10000;++i){ tree=XmlParser.parse(xml); } System.out.println(System.currentTimeMillis()-d2); /**** * 这里使用 tree对象示例 * 获得 节点name的子节点,文本对象 "张三" */ tree=XmlParser.parse("<root><user id='w1'></user><user id='w2'><name>张三</name></user></root>"); XmlNode root=tree.getRoot();// 获得根节点 List<XmlNode> list=root.getChildrenByTagName("user"); XmlNode user2=list.get(1);// 第2个user节点 System.out.println(user2.getAttributes().get("id")); String zhang3=user2. getChildrenByTagName("name").get(0) // 这里是获得user2 的tagName 为 name的子节点, 只有一个,当然是 get(0) .getChildren().get(0).toString();// user2的子节点是String类的对象 "张三" System.out.println(zhang3); }
}
解析的xml 为:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE node[]><root>
<![CDATA[ooooooo]]> <!-- apple orange对对对&&& --> <国家 name="中国"/> <node id="皇帝"> <node name="刘备"> <node name='张\\飞'> <node name="兵1" > <!-- 卡机爱就爱看 --> </node> <node name="兵2" /> <node name="兵3" /> </node> <node name='关羽'> <node name="1兵1" /> <node name="1兵2" /> <node name="1兵3" /> </node> </node> <node name="曹操"> <node name='李典'> <node name="2兵11" /> <node name="2兵2" /> <node name="2兵3" /> </node> </node> </node> <apple>22</apple>
</root>
<!--apple-->
运行结果:
2141
406
w2
张三
》》》可以看出快了大概5倍
ps; 代码发表在google code 上了,项目名为open4j, 无需密码。
org.open4j.nxml包里面为解析代码, 下面有jar包,加入您的路径就能用[color=red][/color]
-
本文附件下载:
<li><a href="http://dl.javaeye.com/topics/download/286ba08f-bfac-3880-b1a6-ebb5c813d5e0">open4j.0.05.jar</a> (309.7 KB)</li>
<li><a href="http://dl.javaeye.com/topics/download/cccee3a3-ce7e-38fc-8385-83245dc50df4">op.location.jar</a> (540 Bytes)</li>
<li><a href="http://dl.javaeye.com/topics/download/4a3bb841-adfd-3b82-847c-3a800601a493">test.xml.zip</a> (469 Bytes)</li>
<br><br>
作者: <a href="http://fyf-008.javaeye.com">fyf_008</a>
<br>
声明: 本文系JavaEye网站发布的原创文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!
<br><br>
<span style="color:red">
<a href="http://www.javaeye.com/topic/935613" style="color:red">已有 <strong>16</strong> 人发表回复,猛击->><strong>这里</strong><<-参与讨论</a>
</span>
<br><br><br>
JavaEye推荐