當前位置:首頁 » 編程語言 » javaxmldom4j解析

javaxmldom4j解析

發布時間: 2023-06-17 00:15:40

1. java的xml的解析方式有什麼,他們的解析流程是怎麼樣的,有什麼區別

答:4種。(或者說是兩種,因為JDOM和DOM4J是DOM的兩個特殊情況)

1.SAX解析
解析方式是事件驅動機制!

SAX解析器,逐行讀取XML文件解析,每當解析到一個標簽的開始/結束/內容/屬性時,觸發事件。

可以在這些事件發生時,編寫程序進行相應的處理。

優點:

分析能夠立即開始,而不是等待所有的數據被處理。

逐行載入,節省內存,有助於解析大於系統內存的文檔。

有時不必解析整個文檔,它可以在某個條件得到滿足時停止解析。

缺點:

1.單向解析,無法定位文檔層次,無法同時訪問同一個文檔的不同部分數據(因為逐行解析,當解析第n行時,第n-1行)已經被釋放了,無法再對其進行操作)。

2. 無法得知事件發生時元素的層次, 只能自己維護節點的父/子關系。

3. 只讀解析方式, 無法修改XML文檔的內容。

2. DOM解析
是用與平台和語言無關的方式表示XML文檔的官方W3C標准,分析該結構通常需要載入整個 文檔和內存中建立文檔樹模型。程序員可以通過操作文檔樹, 來完成數據的獲取 修改 刪除等。

優點:

文檔在內存中載入, 允許對數據和結構做出更改。訪問是雙向的,可以在任何時候在樹中雙向解析數據。

缺點:

文檔全部載入在內存中 , 消耗資源大。

3. JDOM解析
目的是成為Java特定文檔模型,它簡化與XML的交互並且比使用DOM實現更快。由於是第一 個Java特定模型,JDOM一直得到大力推廣和促進。

JDOM文檔聲明其目的是「使用20%(或更少)的精力解決80%(或更多)Java/XML問題」 (根據學習曲線假定為20%)

優點:

使用具體類而不是介面,簡化了DOM的API。

大量使用了Java集合類,方便了Java開發人員。

缺點:

沒有較好的靈活性。

性能不是那麼優異。

4. DOM4J解析
它是JDOM的一種智能分支。它合並了許多超出基本XML文檔表示的功能,包括集成的XPath 支持、XML Schema支持以及用於大文檔或流化文檔的基於事件的處理。它還提供了構建文檔表示的選項, DOM4J是一個非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一 個開放源代碼的軟體。如今你可以看到越來越多的Java軟體都在使用DOM4J來讀寫XML。

目前許多開源項目中大量採用DOM4J , 例如:Hibernate。

2. java 怎樣解析 excel生成的xml文件

java解析excel生成的xml文件的方法是使用dom4j實現的。
dom4j是一個簡單的開源庫,用於處理XML、 XPath和XSLT,它基於Java平台,使用Java的集合框架,全面集成了DOM,SAX和JAXP。
1、excel生成的xml樣例文件:
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<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">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<Created>2006-09-16T00:00:00Z</Created>
<LastSaved>2016-07-25T03:26:50Z</LastSaved>
<Version>14.00</Version>
</DocumentProperties>
<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
<AllowPNG/>
<RemovePersonalInformation/>
</OfficeDocumentSettings>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>7956</WindowHeight>
<WindowWidth>14808</WindowWidth>
<WindowTopX>240</WindowTopX>
<WindowTopY>168</WindowTopY>
<ActiveSheet>2</ActiveSheet>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font ss:FontName="宋體" x:CharSet="134" ss:Size="11" ss:Color="#000000"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
<Style ss:ID="s16" ss:Name="好">
<Font ss:FontName="宋體" x:CharSet="134" ss:Size="11" ss:Color="#006100"/>
<Interior ss:Color="#C6EFCE" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s17">
<Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:Indent="1"
ss:WrapText="1"/>
<Font ss:FontName="宋體" x:CharSet="134" ss:Size="8" ss:Color="#686868"/>
<NumberFormat ss:Format="@"/>
</Style>
<Style ss:ID="s18" ss:Parent="s16">
<Alignment ss:Vertical="Bottom"/>
</Style>
<Style ss:ID="s19">
<NumberFormat ss:Format="yyyy/m/d\ h:mm:ss"/>
</Style>
</Styles>
<Worksheet ss:Name="Sheet1">
<Table ss:ExpandedColumnCount="6" ss:ExpandedRowCount="3" x:FullColumns="1"
x:FullRows="1" ss:DefaultRowHeight="14.4">
<Row>
<Cell><Data ss:Type="String">工號</Data></Cell>
<Cell><Data ss:Type="String">姓名 </Data></Cell>
<Cell ss:Index="5"><Data ss:Type="String">工號</Data></Cell>
<Cell><Data ss:Type="String">姓名</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="Number">111</Data></Cell>
<Cell><Data ss:Type="String">張三</Data></Cell>
<Cell ss:Index="5"><Data ss:Type="Number">111</Data></Cell>
<Cell ss:Formula="=VLOOKUP(R2C5:R3C5,RC[-5]:R[1]C[-4],2)"><Data
ss:Type="String">張三</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="Number">112</Data></Cell>
<Cell><Data ss:Type="String">李四</Data></Cell>
<Cell ss:Index="5"><Data ss:Type="Number">112</Data></Cell>
<Cell ss:Formula="=VLOOKUP(R2C5:R3C5,RC[-5]:R[1]C[-4],2)"><Data
ss:Type="String">李四</Data></Cell>
</Row>
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<PageSetup>
<Header x:Margin="0.3"/>
<Footer x:Margin="0.3"/>
<PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
</PageSetup>
<Panes>
<Pane>
<Number>3</Number>
<ActiveRow>7</ActiveRow>
<ActiveCol>5</ActiveCol>
</Pane>
</Panes>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
</Workbook>
2、java解析代碼:
import java.io.File;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Demo {
public static void main(String[] args) throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("person.xml"));
Element root = document.getRootElement();

Iterator it = root.elementIterator();
while (it.hasNext()) {
Element element = (Element) it.next();

//未知屬性名稱情況下
/*Iterator attrIt = element.attributeIterator();
while (attrIt.hasNext()) {
Attribute a = (Attribute) attrIt.next();
System.out.println(a.getValue());
}*/

//已知屬性名稱情況下
System.out.println("id: " + element.attributeValue("id"));

//未知元素名情況下
/*Iterator eleIt = element.elementIterator();
while (eleIt.hasNext()) {
Element e = (Element) eleIt.next();
System.out.println(e.getName() + ": " + e.getText());
}
System.out.println();*/

//已知元素名情況下
System.out.println("title: " + element.elementText("title"));
System.out.println("author: " + element.elementText("author"));
System.out.println();
}
}
}

3. 在java中解析xml有哪幾種方法

(1)DOM解析
DOM是html和xml的應用程序介面(API),以層次結構(類似於樹型)來組織節點和信息片段,映射XML文檔的結構,允許獲取
和操作文檔的任意部分,是W3C的官方標准
【優點】
①允許應用程序對數據和結構做出更改。
②訪問是雙向的,可以在任何時候在樹中上下導航,獲取和操作任意部分的數據。
【缺點】
①通常需要載入整個XML文檔來構造層次結構,消耗資源大。
【解析詳解】
①構建Document對象:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = bdf.newDocumentBuilder();
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(xml文件);
Document doc = bd.parse(is);
②遍歷DOM對象
Document: XML文檔對象,由解析器獲取
NodeList: 節點數組
Node: 節點(包括element、#text)
Element: 元素,可用於獲取屬性參數
(2)SAX(Simple API for XML)解析
流模型中的"推"模型分析方式。通過事件驅動,每發現一個節點就引發一個事件,事件推給事件處理器,通過回調方法
完成解析工作,解析XML文檔的邏輯需要應用程序完成
【優勢】
①不需要等待所有數據都被處理,分析就能立即開始。
②只在讀取數據時檢查數據,不需要保存在內存中。
③可以在某個條件得到滿足時停止解析,不必解析整個文檔。
④效率和性能較高,能解析大於系統內存的文檔。
【缺點】
①需要應用程序自己負責TAG的處理邏輯(例如維護父/子關系等),文檔越復雜程序就越復雜。
②單向導航,無法定位文檔層次,很難同時訪問同一文檔的不同部分數據,不支持XPath。
【原理】
簡單的說就是對文檔進行順序掃描,當掃描到文檔(document)開始與結束、元素(element)開始與結束時通知事件
處理函數(回調函數),進行相應處理,直到文檔結束
【事件處理器類型】
①訪問XML DTD:DTDHandler
②低級訪問解析錯誤:ErrorHandler
③訪問文檔內容:ContextHandler
【DefaultHandler類】
SAX事件處理程序的默認基類,實現了DTDHandler、ErrorHandler、ContextHandler和EntityResolver介面,通常
做法是,繼承該基類,重寫需要的方法,如startDocument()
【創建SAX解析器】
SAXParserFactory saxf = SAXParserFactory.newInstance();
SAXParser sax = saxf.newSAXParser();
註:關於遍歷
①深度優先遍歷(Depthi-First Traserval)
②廣度優先遍歷(Width-First Traserval)
(3)JDOM(Java-based Document Object Model)
Java特定的文檔對象模型。自身不包含解析器,使用SAX
【優點】
①使用具體類而不是介面,簡化了DOM的API。
②大量使用了Java集合類,方便了Java開發人員。
【缺點】
①沒有較好的靈活性。
②性能較差。
(4)DOM4J(Document Object Model for Java)
簡單易用,採用Java集合框架,並完全支持DOM、SAX和JAXP
【優點】
①大量使用了Java集合類,方便Java開發人員,同時提供一些提高性能的替代方法。
②支持XPath。
③有很好的性能。
【缺點】
①大量使用了介面,API較為復雜。
(5)StAX(Streaming API for XML)
流模型中的拉模型分析方式。提供基於指針和基於迭代器兩種方式的支持,JDK1.6新特性
【和推式解析相比的優點】
①在拉式解析中,事件是由解析應用產生的,因此拉式解析中向客戶端提供的是解析規則,而不是解析器。
②同推式解析相比,拉式解析的代碼更簡單,而且不用那麼多庫。
③拉式解析客戶端能夠一次讀取多個XML文件。
④拉式解析允許你過濾XML文件和跳過解析事件。
【簡介】
StAX API的實現是使用了Java Web服務開發(JWSDP)1.6,並結合了Sun Java流式XML分析器(SJSXP)-它位於
javax.xml.stream包中。XMLStreamReader介面用於分析一個XML文檔,而XMLStreamWriter介面用於生成一個
XML文檔。XMLEventReader負責使用一個對象事件迭代子分析XML事件-這與XMLStreamReader所使用的游標機制
形成對照。

4. 在java中怎麼用dom4j解析XML文件

以下是曾經寫的一個解析XML獲取XML中圖片流的字元串,獲取並轉化為圖片的工具類

裡面海帶喲base64編碼,具體代碼如下,希望能幫到你

packagecom.asidel.web.util;

importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.OutputStream;
importjava.util.Iterator;
importjava.util.List;

importorg.dom4j.Document;
importorg.dom4j.DocumentHelper;
importorg.dom4j.Element;

importsun.misc.BASE64Decoder;
importsun.misc.BASE64Encoder;

importcom.dragonsoft.adapter.AdapterSend;

publicclassXMLparserUtil{

/**
*@Title:getXp
*@Description:解析XML
*@return
*/
publicstaticStringgetXp(StringxmlStr,Stringsfzh){
Stringxp="";
try{
//將String轉化成xml
Documentdocument=DocumentHelper.parseText(xmlStr);

//獲取Value節點下的Row子節點
ListRowElementList=XMLparserUtil.getRowElementList(document);
if(RowElementList!=null&&RowElementList.size()>0){
ElementRowElement3=(Element)RowElementList.get(RowElementList.size()-1);
//根據節點獲取值
StringxpBase64=RowElement3.elementTextTrim("Data");
//System.out.println("xpBase64:"+xpBase64);
if(!"".equals(xpBase64)&&xpBase64!=null){
xp=XMLparserUtil.getDecodingBASE64(xpBase64,sfzh);
}
//System.out.println("xp:"+xp);
}

}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
xp="";
}
returnxp;
}

/**
*@Title:getEncodingBASE64
*@Description:進行BASE64編碼
*@paramstring
*@return
*/
(Stringstring){
StringreturnStr="";
if(!"".equals(string)&&string!=null){
try{
BASE64Encoderbase64Encoder=newBASE64Encoder();
returnStr=base64Encoder.encode(string.getBytes());
}catch(Exceptione){
//TODO:handleexception
e.printStackTrace();
}
}
returnreturnStr;
}

/**
*@Title:getDecodingBASE64
*@Description:將BASE64編碼的字元串進行解碼
*@paramstring
*@return
*/
(StringimgStr,StringimgName){
StringimgFilePath="";//新生成的圖片
BASE64Decoderdecoder=newBASE64Decoder();
if(!"".equals(imgStr)&&imgStr!=null){
try{
byte[]b=decoder.decodeBuffer(imgStr);
for(inti=0;i<b.length;++i){
if(b[i]<0){//調整異常數據
b[i]+=256;
}
}
//生成jpeg圖片
PathUtilpathUtil=newPathUtil();
Stringzdryxppath=pathUtil.getWebRoot()+"uploadImages/";
System.out.println("zdryxppath="+zdryxppath);
FilepathDir=newFile(zdryxppath);//如果目錄不存在就創建該目錄
if(!pathDir.exists()){
pathDir.mkdirs();
}
StringimgFileRealPath=zdryxppath+imgName+".jpg";//新生成的圖片
OutputStreamout=newFileOutputStream(imgFileRealPath);
out.write(b);
out.flush();
out.close();
imgFilePath="uploadImages/"+imgName+".jpg";
}catch(Exceptione){
e.printStackTrace();
}
}
returnimgFilePath;
}

/**
*@Title:getRowElementList
*@Description:獲取節點列表
*@paramdocument
*@paramstring
*@return
*
*/
(Documentdocument){

ListreturnRowElementList=null;
//獲取根節點
ElementrootElement=document.getRootElement();
//System.out.println("rootElement:"+rootElement);
//獲取根節點下的Method子節點
IteratorMethodElementList=rootElement.elementIterator("Method");
//遍歷Method節點
while(MethodElementList.hasNext()){
ElementMethodElement=(Element)MethodElementList.next();
//System.out.println("Method:"+MethodElement);
//獲取Method節點下的Items子節點
IteratorItemsElementList=MethodElement.elementIterator("Items");
//遍歷Items節點
while(ItemsElementList.hasNext()){
ElementItemsElement=(Element)ItemsElementList.next();
//System.out.println("Items:"+ItemsElement);
//獲取Items節點下的Item子節點
IteratorItemElementList=ItemsElement.elementIterator("Item");
//遍歷Item節點
while(ItemElementList.hasNext()){
ElementItemElement=(Element)ItemElementList.next();
//System.out.println("Item:"+ItemElement);
//獲取Item節點下的Value子節點
IteratorValueElementList=ItemElement.elementIterator("Value");
//遍歷Value節點
while(ValueElementList.hasNext()){
ElementValueElement=(Element)ValueElementList.next();
//System.out.println("Value:"+ValueElement);
returnRowElementList=ValueElement.elements("Row");
////獲取Value節點下的Row子節點
//List
//if(RowElementList!=null&&RowElementList.size()>
//0){
//ElementRowElement3=(Element)
//RowElementList.get(RowElementList.size()-1);
////System.out.println("Row:"+RowElement3);
////根據節點獲取值
//xp=RowElement3.elementTextTrim("Data");
//System.out.println("xp:"+xp);
//}
}
}
}
}

returnreturnRowElementList;
}

publicstaticvoidmain(String[]args){}
}

5. java中dom4j解析xml文件怎麼獲取節點屬性

dom4j中,使用Element.attributes方法可以獲取到節點的屬性,而使用elements則可以獲取相應的子節點
比如:
Element root = doc.getRootElement();
List attrList = root.attributes();
for (int i = 0; i < attrList.size(); i++) {
//屬性的取得
Attribute item = (Attribute)attrList.get(i);
System.out.println(item.getName() + "=" + item.getValue());
}
List childList = root.elements();
for (int i = 0; i < childList.size(); i++) {
//子節點的操作
Element it = (Element) childList.get(i);
//對子節點進行其它操作...
}

熱點內容
銳志哪個配置性價比最高 發布:2025-02-12 17:38:43 瀏覽:918
智能推送演算法 發布:2025-02-12 17:38:41 瀏覽:835
拍照上傳器 發布:2025-02-12 17:34:29 瀏覽:652
androidweb框架 發布:2025-02-12 17:32:45 瀏覽:76
安卓編程賀卡 發布:2025-02-12 17:32:44 瀏覽:838
php獲取資料庫的欄位 發布:2025-02-12 17:29:02 瀏覽:766
伺服器地址消失 發布:2025-02-12 17:23:36 瀏覽:951
後台執行php腳本 發布:2025-02-12 17:21:45 瀏覽:471
spring編程式事務 發布:2025-02-12 17:16:55 瀏覽:398
nginx禁止ip訪問 發布:2025-02-12 17:15:14 瀏覽:274