java使用xpath和dom4j解析xml
1 xml文件解析的4种方法
通常解析xml文件有四种经典的方法。基本的解析方式有两种,一种叫sax,另一种叫dom。sax是基于事件流的解析,dom是基于xml文档树结构的解析。在此基础上,为了减少dom、sax的编码量,出现了jdom,其优点是,20-80原则(帕累托法则),极大减少了代码量。通常情况下jdom使用时满足要实现的功能简单,如解析、创建等要求。但在底层,jdom还是使用sax(最常用)、dom、xanan文档。另外一种是dom4j,是一个非常非常优秀的java xml api,具有性能优异、功能强大和极端易用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 java 软件都在使用 dom4j 来读写 xml,特别值得一提的是连 sun 的 jaxm 也在用 dom4j。具体四种方法的使用,百度一下,会有众多详细的介绍。
2 xpath简单介绍
xpath是一门在xml文档中查找信息的语言。xpath用于在 xml 文档中通过元素和属性进行导航,并对元素和属性进行遍历。xpath 是 w3c xslt 标准的主要元素,并且 xquery 和 xpointer 同时被构建于 xpath 表达之上。因此,对 xpath 的理解是很多高级 xml 应用的基础。xpath非常类似对数据库操作的sql语言,或者说jquery,它可以方便开发者抓起文档中需要的东西。其中dom4j也支持xpath的使用。
3 dom4j使用xpath
dom4j使用xpath解析xml文档是,首先需要在项目中引用两个jar包:
dom4j-1.6.1.jar:dom4j软件包,下载地址http://sourceforge.net/projects/dom4j/;
jaxen-xx.xx.jar:通常不添加此包,会引发异常(java.lang.noclassdeffounderror: org/jaxen/jaxenexception),下载地址http://www.jaxen.org/releases.html。
3.1 命名空间(namespace)的干扰
在处理由excel文件或其他格式文件转换的xml文件时,通常会遇到通过xpath解析得不到结果的情况。这种情况通常是由于命名空间的存在导致的。以下述内容的xml文件为例,通过xpath=" // workbook/ worksheet / table / row[1]/ cell[1]/data[1] "进行简单的检索,通常是没有结果出现的。这就是由于命名空间namespace(xmlns="urn:schemas-microsoft-com:office:spreadsheet")导致的。
<workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/tr/rec-html40">
<worksheet ss:name="sheet1">
<table ss:expandedcolumncount="81" ss:expandedrowcount="687" x:fullcolumns="1" x:fullrows="1" ss:defaultcolumnwidth="52.5" ss:defaultrowheight="15.5625">
<row ss:autofitheight="0">
<cell>
<data ss:type="string">敲代码的耗子</data>
</cell>
</row>
<row ss:autofitheight="0">
<cell>
<data ss:type="string">sunny</data>
</cell>
</row>
</table>
</worksheet>
</workbook>
3.2 xpath对带有命名空间的xml文件解析
第一种方法(read1()函数):使用xpath语法中自带的local-name() 和 namespace-uri() 指定你要使用的节点名和命名空间。 xpath表达式书写较为麻烦。
第二种方法(read2()函数):设置xpath的命名空间,利用setnamespaceuris()函数。
第三种方法(read3()函数):设置documentfactory()的命名空间 ,使用的函数是setxpathnamespaceuris()。二和三两种方法的xpath表达式书写相对简单。
第四种方法(read4()函数):方法和第三种一样,但是xpath表达式不同(程序具体体现),主要是为了检验xpath表达式的不同,主要指完整程度,是否会对检索效率产生影响。
(以上四种方法均通过dom4j结合xpath对xml文件进行解析)
第五种方法(read5()函数):使用dom结合xpath对xml文件进行解析,主要是为了检验性能差异。
没有什么能够比代码更能说明问题的了!果断上代码!
packagexpath;
importjava.io.ioexception;
importjava.io.inputstream;
importjava.util.hashmap;
importjava.util.list;
importjava.util.map;
importjavax.xml.parsers.documentbuilder;
importjavax.xml.parsers.documentbuilderfactory;
importjavax.xml.parsers.parserconfigurationexception;
importjavax.xml.xpath.xpathconstants;
importjavax.xml.xpath.xpathexpression;
importjavax.xml.xpath.xpathexpressionexception;
importjavax.xml.xpath.xpathfactory;
importorg.dom4j.document;
importorg.dom4j.documentexception;
importorg.dom4j.element;
importorg.dom4j.xpath;
importorg.dom4j.io.saxreader;
importorg.w3c.dom.nodelist;
importorg.xml.sax.saxexception;
/**
*dom4jdomxmlxpath
*/
publicclasstestdom4jxpath{
publicstaticvoidmain(string[]args){
read1();
read2();
read3();
read4();//read3()方法一样,但是xpath表达式不同
read5();
}
publicstaticvoidread1(){
/*
*uselocal-name()andnamespace-uri()inxpath
*/
try{
longstarttime=system.currenttimemillis();
saxreaderreader=newsaxreader();
inputstreamin=testdom4jxpath.class.getclassloader().getresourceasstream("xpath\\xxx.xml");
documentdoc=reader.read(in);
/*stringxpath="//*[local-name()='workbook'andnamespace-uri()='urn:schemas-microsoft-com:office:spreadsheet']"
+"/*[local-name()='worksheet']"
+"/*[local-name()='table']"
+"/*[local-name()='row'][4]"
+"/*[local-name()='cell'][3]"
+"/*[local-name()='data'][1]";*/
stringxpath="//*[local-name()='row'][4]/*[local-name()='cell'][3]/*[local-name()='data'][1]";
system.err.println("=====uselocal-name()andnamespace-uri()inxpath====");
system.err.println("xpath:"+xpath);
@suppresswarnings("unchecked")
list<element>list=doc.selectnodes(xpath);
for(objecto:list){
elemente=(element)o;
stringshow=e.getstringvalue();
system.out.println("show="+show);
longendtime=system.currenttimemillis();
system.out.println("程序运行时间:"+(endtime-starttime)+"ms");
}
}catch(documentexceptione){
e.printstacktrace();
}
}
publicstaticvoidread2(){
/*
*setxpathnamespace(setnamespaceuris)
*/
try{
longstarttime=system.currenttimemillis();
mapmap=newhashmap();
map.put("workbook","urn:schemas-microsoft-com:office:spreadsheet");
saxreaderreader=newsaxreader();
inputstreamin=testdom4jxpath.class.getclassloader().getresourceasstream("xpath\\xxx.xml");
documentdoc=reader.read(in);
stringxpath="//workbook:row[4]/workbook:cell[3]/workbook:data[1]";
system.err.println("=====usesetnamespaceuris()tosetxpathnamespace====");
system.err.println("xpath:"+xpath);
xpathx=doc.createxpath(xpath);
x.setnamespaceuris(map);
@suppresswarnings("unchecked")
list<element>list=x.selectnodes(doc);
for(objecto:list){
elemente=(element)o;
stringshow=e.getstringvalue();
system.out.println("show="+show);
longendtime=system.currenttimemillis();
system.out.println("程序运行时间:"+(endtime-starttime)+"ms");
}
}catch(documentexceptione){
e.printstacktrace();
}
}
publicstaticvoidread3(){
/*
*setdocumentfactory()namespace(setxpathnamespaceuris)
*/
try{
longstarttime=system.currenttimemillis();
mapmap=newhashmap();
map.put("workbook","urn:schemas-microsoft-com:office:spreadsheet");
saxreaderreader=newsaxreader();
inputstreamin=testdom4jxpath.class.getclassloader().getresourceasstream("xpath\\xxx.xml");
reader.getdocumentfactory().setxpathnamespaceuris(map);
documentdoc=reader.read(in);
stringxpath="//workbook:row[4]/workbook:cell[3]/workbook:data[1]";
system.err.println("=====usesetxpathnamespaceuris()tosetdocumentfactory()namespace====");
system.err.println("xpath:"+xpath);
@suppresswarnings("unchecked")
list<element>list=doc.selectnodes(xpath);
for(objecto:list){
elemente=(element)o;
stringshow=e.getstringvalue();
system.out.println("show="+show);
longendtime=system.currenttimemillis();
system.out.println("程序运行时间:"+(endtime-starttime)+"ms");
}
}catch(documentexceptione){
e.printstacktrace();
}
}
publicstaticvoidread4(){
/*
*同read3()方法一样,但是xpath表达式不同
*/
try{
longstarttime=system.currenttimemillis();
mapmap=newhashmap();
map.put("workbook","urn:schemas-microsoft-com:office:spreadsheet");
saxreaderreader=newsaxreader();
inputstreamin=testdom4jxpath.class.getclassloader().getresourceasstream("xpath\\xxx.xml");
reader.getdocumentfactory().setxpathnamespaceuris(map);
documentdoc=reader.read(in);
stringxpath="//workbook:worksheet/workbook:table/workbook:row[4]/workbook:cell[3]/workbook:data[1]";
system.err.println("=====usesetxpathnamespaceuris()tosetdocumentfactory()namespace====");
system.err.println("xpath:"+xpath);
@suppresswarnings("unchecked")
list<element>list=doc.selectnodes(xpath);
for(objecto:list){
elemente=(element)o;
stringshow=e.getstringvalue();
system.out.println("show="+show);
longendtime=system.currenttimemillis();
system.out.println("程序运行时间:"+(endtime-starttime)+"ms");
}
}catch(documentexceptione){
e.printstacktrace();
}
}
publicstaticvoidread5(){
/*
*domandxpath
*/
try{
longstarttime=system.currenttimemillis();
documentbuilderfactorydbf=documentbuilderfactory.newinstance();
dbf.setnamespaceaware(false);
documentbuilderbuilder=dbf.newdocumentbuilder();
inputstreamin=testdom4jxpath.class.getclassloader().getresourceasstream("xpath\\xxx.xml");
org.w3c.dom.documentdoc=builder.parse(in);
xpathfactoryfactory=xpathfactory.newinstance();
javax.xml.xpath.xpathx=factory.newxpath();
//选取所有class元素的name属性
stringxpath="//workbook/worksheet/table/row[4]/cell[3]/data[1]";
system.err.println("=====domxpath====");
system.err.println("xpath:"+xpath);
xpathexpressionexpr=x.compile(xpath);
nodelistnodes=(nodelist)expr.evaluate(doc,xpathconstants.node);
for(inti=0;i<nodes.getlength();i++){
system.out.println("show="+nodes.item(i).getnodevalue());
longendtime=system.currenttimemillis();
system.out.println("程序运行时间:"+(endtime-starttime)+"ms");
}
}catch(xpathexpressionexceptione){
e.printstacktrace();
}catch(parserconfigurationexceptione){
e.printstacktrace();
}catch(saxexceptione){
e.printstacktrace();
}catch(ioexceptione){
e.printstacktrace();
}
}
}
ps:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:
在线xml/json互相转换工具:
在线格式化xml/在线压缩xml:
xml在线压缩/格式化工具:
推荐阅读
-
java使用xpath和dom4j解析xml
-
springboot使用Mybatis(xml和注解)过程全解析
-
java基于dom4j包实现对XML解析的方法
-
Java生成和解析XML格式文件和字符串的实例代码
-
dom4j和jsoup解析百度地图xml获取地方信息 博客分类: JsoupXML dom4jxmljsoup
-
【java项目实战】dom4j解析xml文件,连接Oracle数据库 博客分类: 【JavaScript】 xml编程dom4j
-
dom4j创建xml和读取xml的demo 博客分类: java基础 dom4jxmlSAXReader
-
使用dom4j来解析xml文件或xml字符串 博客分类: Java EE dom4jxml解析xml文件xml字符串
-
java解析xml之dom4j解析xml示例分享
-
java使用dom4j解析xml配置文件实现抽象工厂反射示例