程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java應用xpath和dom4j解析xml

java應用xpath和dom4j解析xml

編輯:關於JAVA

java應用xpath和dom4j解析xml。本站提示廣大學習愛好者:(java應用xpath和dom4j解析xml)文章只能為提供參考,不一定能成為您想要的結果。以下是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();
}
}
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved