javaxml解析效率_JAVA通过XPath解析XML性能⽐较详解最近在做⼀个⼩项⽬,使⽤到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包:
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")导致的。
敲代码的耗⼦
Sunny
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⽂件进⾏解析,主要是为了检验性能差异。
没有什么能够⽐代码更能说明问题的了!果断上代码!
package XPath;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
l.parsers.DocumentBuilder;
l.parsers.DocumentBuilderFactory;
l.parsers.ParserConfigurationException;
l.xpath.XPathConstants;
l.xpath.XPathExpression;
l.xpath.XPathExpressionException;
l.xpath.XPathFactory;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.SAXReader;
import org.w3c.dom.NodeList;
l.sax.SAXException;
/**
* DOM4J DOM XML XPath
* @author hao
*/
public class TestDom4jXpath {
public static void main(String[] args) {
read1();
read2();
read3();
read4();//read3()⽅法⼀样,但是XPath表达式不同
read5();
}
public static void read1() {
/*
* use local-name() and namespace-uri() in XPath
*/
try {
long startTime=System.currentTimeMillis();
SAXReader reader = new SAXReader();
InputStream in = ClassLoader().getResourceAsStream("XPath\\l"); Document doc = ad(in);
/*String xpath ="//*[local-name()='Workbook' and namespace-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]";*/
String xpath ="//*[local-name()='Row'][4]/*[local-name()='Cell'][3]/*[local-name()='Data'][1]";
@SuppressWarnings("unchecked")
List list = doc.selectNodes(xpath);
for(Object o:list){
Element e = (Element) o;
String StringValue();
System.out.println("show = " + show);
long endTime=System.currentTimeMillis();
System.out.println("程序运⾏时间: "+(endTime-startTime)+"ms");
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static void read2() {
/*
* set xpath namespace(setNamespaceURIs)
*/
try {
long startTime=System.currentTimeMillis();
Map map = new HashMap();
map.put("Workbook","urn:schemas-microsoft-com:office:spreadsheet");
SAXReader reader = new SAXReader();
InputStream in = ClassLoader().getResourceAsStream("XPath\\l");
Document doc = ad(in);
String xpath ="//Workbook:Row[4]/Workbook:Cell[3]/Workbook:Data[1]";
XPath x = ateXPath(xpath);
x.setNamespaceURIs(map);
@SuppressWarnings("unchecked")
List list = x.selectNodes(doc);
for(Object o:list){
Element e = (Element) o;
String StringValue();
System.out.println("show = " + show);
long endTime=System.currentTimeMillis();
System.out.println("程序运⾏时间: "+(endTime-startTime)+"ms");
dom4j读取xml}
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static void read3() {
/
*
* set DocumentFactory() namespace(setXPathNamespaceURIs)
*/
try {
long startTime=System.currentTimeMillis();
Map map = new HashMap();
map.put("Workbook","urn:schemas-microsoft-com:office:spreadsheet");
SAXReader reader = new SAXReader();
InputStream in = ClassLoader().getResourceAsStream("XPath\\l"); DocumentFactory().setXPathNamespaceURIs(map);
Document doc = ad(in);
String xpath ="//Workbook:Row[4]/Workbook:Cell[3]/Workbook:Data[1]";
@SuppressWarnings("unchecked")
List list = doc.selectNodes(xpath);
for(Object o:list){
Element e = (Element) o;
String StringValue();
System.out.println("show = " + show);
long endTime=System.currentTimeMillis();
System.out.println("程序运⾏时间: "+(endTime-startTime)+"ms");
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static void read4() {
/*
* 同read3()⽅法⼀样,但是XPath表达式不同
*/
try {
long startTime=System.currentTimeMillis();
Map map = new HashMap();
map.put("Workbook","urn:schemas-microsoft-com:office:spreadsheet");
SAXReader reader = new SAXReader();
InputStream in = ClassLoader().getResourceAsStream("XPath\\l");
Document doc = ad(in);
String xpath ="//Workbook:Worksheet/Workbook:Table/Workbook:Row[4]/Workbook:Cell[3]/Workbook:Data[1]"; println("=====use setXPathNamespaceURIs() to set DocumentFactory() namespace====");
@SuppressWarnings("unchecked")
List list = doc.selectNodes(xpath);
for(Object o:list){
Element e = (Element) o;
String StringValue();
System.out.println("show = " + show);
long endTime=System.currentTimeMillis();
System.out.println("程序运⾏时间: "+(endTime-startTime)+"ms");
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论