這篇文章給大家分享的是有關(guān)java使用xpath和dom4j解析xml的示例的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),湯原企業(yè)網(wǎng)站建設(shè),湯原品牌網(wǎng)站建設(shè),網(wǎng)站定制,湯原網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,湯原網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
1 XML文件解析的4種方法
通常解析XML文件有四種經(jīng)典的方法?;镜慕馕龇绞接袃煞N,一種叫SAX,另一種叫DOM。SAX是基于事件流的解析,DOM是基于XML文檔樹結(jié)構(gòu)的解析。在此基礎(chǔ)上,為了減少DOM、SAX的編碼量,出現(xiàn)了JDOM,其優(yōu)點(diǎn)是,20-80原則(帕累托法則),極大減少了代碼量。通常情況下JDOM使用時滿足要實現(xiàn)的功能簡單,如解析、創(chuàng)建等要求。但在底層,JDOM還是使用SAX(最常用)、DOM、Xanan文檔。另外一種是DOM4J,是一個非常非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強(qiáng)大和極端易用的特點(diǎn),同時它也是一個開放源代碼的軟件。如今你可以看到越來越多的 Java 軟件都在使用 DOM4J 來讀寫 XML,特別值得一提的是連 Sun 的 JAXM 也在用 DOM4J。具體四種方法的使用,百度一下,會有眾多詳細(xì)的介紹。
2 XPath簡單介紹
XPath是一門在XML文檔中查找信息的語言。XPath用于在 XML 文檔中通過元素和屬性進(jìn)行導(dǎo)航,并對元素和屬性進(jìn)行遍歷。XPath 是 W3C XSLT 標(biāo)準(zhǔn)的主要元素,并且 XQuery 和 XPointer 同時被構(gòu)建于 XPath 表達(dá)之上。因此,對 XPath 的理解是很多高級 XML 應(yīng)用的基礎(chǔ)。XPath非常類似對數(shù)據(jù)庫操作的SQL語言,或者說JQuery,它可以方便開發(fā)者抓起文檔中需要的東西。其中DOM4J也支持XPath的使用。
3 DOM4J使用XPath
DOM4J使用XPath解析XML文檔是,首先需要在項目中引用兩個JAR包:
dom4j-1.6.1.jar:DOM4J軟件包,下載地址http://sourceforge.net/projects/dom4j/;
jaxen-xx.xx.jar:通常不添加此包,會引發(fā)異常(java.lang.NoClassDefFoundError: org/jaxen/JaxenException),下載地址http://www.jaxen.org/releases.html。
3.1 命名空間(namespace)的干擾
在處理由excel文件或其他格式文件轉(zhuǎn)換的xml文件時,通常會遇到通過XPath解析得不到結(jié)果的情況。這種情況通常是由于命名空間的存在導(dǎo)致的。以下述內(nèi)容的XML文件為例,通過XPath=" // Workbook/ Worksheet / Table / Row[1]/ Cell[1]/Data[1] "進(jìn)行簡單的檢索,通常是沒有結(jié)果出現(xiàn)的。這就是由于命名空間namespace(xmlns="urn:schemas-microsoft-com:office:spreadsheet")導(dǎo)致的。
|
敲代碼的耗子 | |
Sunny |
3.2 XPath對帶有命名空間的xml文件解析
第一種方法(read1()函數(shù)):使用XPath語法中自帶的local-name() 和 namespace-uri() 指定你要使用的節(jié)點(diǎn)名和命名空間。 XPath表達(dá)式書寫較為麻煩。
第二種方法(read2()函數(shù)):設(shè)置XPath的命名空間,利用setNamespaceURIs()函數(shù)。
第三種方法(read3()函數(shù)):設(shè)置DocumentFactory()的命名空間 ,使用的函數(shù)是setXPathNamespaceURIs()。二和三兩種方法的XPath表達(dá)式書寫相對簡單。
第四種方法(read4()函數(shù)):方法和第三種一樣,但是XPath表達(dá)式不同(程序具體體現(xiàn)),主要是為了檢驗XPath表達(dá)式的不同,主要指完整程度,是否會對檢索效率產(chǎn)生影響。
(以上四種方法均通過DOM4J結(jié)合XPath對XML文件進(jìn)行解析)
第五種方法(read5()函數(shù)):使用DOM結(jié)合XPath對XML文件進(jìn)行解析,主要是為了檢驗性能差異。
沒有什么能夠比代碼更能說明問題的了!果斷上代碼!
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表達(dá)式不同 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="http://*[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="http://*[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") Listlist=doc.selectNodes(xpath); for(Objecto:list){ Elemente=(Element)o; Stringshow=e.getStringValue(); System.out.println("show="+show); longendTime=System.currentTimeMillis(); System.out.println("程序運(yùn)行時間:"+(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="http://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 list=x.selectNodes(doc); for(Objecto:list){ Elemente=(Element)o; Stringshow=e.getStringValue(); System.out.println("show="+show); longendTime=System.currentTimeMillis(); System.out.println("程序運(yùn)行時間:"+(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="http://Workbook:Row[4]/Workbook:Cell[3]/Workbook:Data[1]"; System.err.println("=====usesetXPathNamespaceURIs()tosetDocumentFactory()namespace===="); System.err.println("XPath:"+xpath); @SuppressWarnings("unchecked") List list=doc.selectNodes(xpath); for(Objecto:list){ Elemente=(Element)o; Stringshow=e.getStringValue(); System.out.println("show="+show); longendTime=System.currentTimeMillis(); System.out.println("程序運(yùn)行時間:"+(endTime-startTime)+"ms"); } }catch(DocumentExceptione){ e.printStackTrace(); } } publicstaticvoidread4(){ /* *同read3()方法一樣,但是XPath表達(dá)式不同 */ 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="http://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 list=doc.selectNodes(xpath); for(Objecto:list){ Elemente=(Element)o; Stringshow=e.getStringValue(); System.out.println("show="+show); longendTime=System.currentTimeMillis(); System.out.println("程序運(yùn)行時間:"+(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="http://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 感謝各位的閱讀!關(guān)于java使用xpath和dom4j解析xml的示例就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
網(wǎng)站標(biāo)題:java使用xpath和dom4j解析xml的示例
文章地址:http://weahome.cn/article/goighi.html