版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、xml的四種解析方法及源代碼(SAX、DOM、JDOM、DOM4J)第一種:SAX解析 SAX處理機制:SAX是一種基于事件驅(qū)動的API。利用SAX解析XML文檔,牽涉到兩個部分:解析器和事件處理器。解析器負責(zé)讀取XML文檔,并向事件處理器發(fā)生事件,如元素開始和元素結(jié)束事件;而事件處理器則負責(zé)對事件做出響應(yīng),對傳遞的XML數(shù)據(jù)進行處理。測試用的xml文件:db.xmlXml代碼 !-oracle.jdbc.driver.OracleDriverjdbc:oracle:thin:localhost:1521:oraclescotttiger!- oracle.jdbc.driver.Oracle
2、Driver jdbc:oracle:thin:localhost:1521:oracle scott tiger DTD文件db.dtdXml代碼 SAX解析實例一org.xml.sax.DefalutHandler類: 可以擴展該類,給出自己的解析實現(xiàn)SAXPrinter.javaJava代碼 importjava.io.File; importjavax.xml.parsers.SAXParser; importjavax.xml.parsers.SAXParserFactory; importorg.xml.sax.Attributes; importorg.xml.sax.SAXEx
3、ception; importorg.xml.sax.helpers.DefaultHandler; publicclassSAXPrinterextendsDefaultHandler /*/* *文檔開始事件 */publicvoidstartDocument()throwsSAXException System.out.println(); /*/* *接收處理指令事件 */publicvoidprocessingInstruction(Stringtarget,Stringdata)throwsSAXException System.out.println(); /*/* *元素開始事
4、件 *參數(shù)說明: *uri-名稱空間URI,如果元素沒有任何名稱空間URI,或者沒有正在執(zhí)行名稱空間處理,則為空字符串。 *localName-本地名稱(不帶前綴),如果沒有正在執(zhí)行名稱空間處理,則為空字符串。 *qName-限定的名稱(帶有前綴),如果限定的名稱不可用,則為空字符串。 *attributes-附加到元素的屬性。如果沒有屬性,則它將是空的Attributes對象。 */publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattrs)throwsSAXException System.out
5、.print(+qName);/輸出元素名稱 intlen=attrs.getLength();/元素屬性列表長度 /利用循環(huán)輸出屬性列表 for(inti=0;i); /*/* *元素中字符數(shù)據(jù)事件:接收元素中字符數(shù)據(jù) *注意:1.應(yīng)用程序不要試圖讀取ch數(shù)組指定范圍外的數(shù)據(jù),(即start至length之外) *2.有些解析器將使用ignorableWhitespace()方法來報告元素內(nèi)容中的空白,而不是characters()方法,如:進行有效性驗證的解析器 */publicvoidcharacters(charch,intstart,intlength)throwsSAXExcept
6、ion System.out.print(newString(ch,start,length); /*/* *結(jié)束元素事件 */publicvoidendElement(Stringuri,StringlocalName,StringqName)throwsSAXException System.out.print(); publicstaticvoidmain(Stringargs) SAXParserFactoryspf=SAXParserFactory.newInstance(); try SAXParsersp=spf.newSAXParser(); sp.parse(newFile(
7、db.xml),newSAXPrinter(); catch(Exceptione) e.printStackTrace(); import java.io.File;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class SAXPrinter extends Def
8、aultHandler /* */* * 文檔開始事件 */ public void startDocument() throws SAXException System.out.println(); /* */* * 接收處理指令事件 */ public void processingInstruction(String target, String data) throws SAXException System.out.println(); /* */* * 元素開始事件 * 參數(shù)說明: * uri - 名稱空間 URI,如果元素沒有任何名稱空間 URI,或者沒有正在執(zhí)行名稱空間處理,則
9、為空字符串。 * localName - 本地名稱(不帶前綴),如果沒有正在執(zhí)行名稱空間處理,則為空字符串。 * qName - 限定的名稱(帶有前綴),如果限定的名稱不可用,則為空字符串。 * attributes - 附加到元素的屬性。如果沒有屬性,則它將是空的 Attributes 對象。 */ public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException System.out.print(+qName);/輸出元素名稱 int len=
10、attrs.getLength();/元素屬性列表長度 /利用循環(huán)輸出屬性列表 for(int i=0;i); /* */* * 元素中字符數(shù)據(jù)事件:接收元素中字符數(shù)據(jù) * 注意:1.應(yīng)用程序不要試圖讀取ch數(shù)組指定范圍外的數(shù)據(jù),(即start至length之外) * 2.有些解析器將使用ignorableWhitespace()方法來報告元素內(nèi)容中的空白,而不是characters()方法,如:進行有效性驗證的解析器 */ public void characters(char ch, int start, int length) throws SAXException System.out
11、.print(new String(ch,start,length); /* */* * 結(jié)束元素事件 */ public void endElement(String uri, String localName, String qName) throws SAXException System.out.print(); public static void main(String args) SAXParserFactory spf=SAXParserFactory.newInstance(); try SAXParser sp=spf.newSAXParser(); sp.parse(ne
12、w File(db.xml),new SAXPrinter(); catch (Exception e) e.printStackTrace(); SAX解析實例二org.xml.sax.ContentHandler接口: 通過實現(xiàn)該接口給出自己的解析實現(xiàn)。org.xml.sax.ErrorHandler接口:如果SAX應(yīng)用程序需要實現(xiàn)定制的錯誤處理,那么它必須實現(xiàn)這個接口,并調(diào)用XMLReader對象的setErrorHandler()方法向解析器注冊異常處理實例,這樣,解析器將通過這個接口報告所有的錯誤和警告。ContentHandlerImpl.javaJava代碼 importorg.
13、xml.sax.Attributes; importorg.xml.sax.ContentHandler; importorg.xml.sax.Locator; importorg.xml.sax.SAXException; publicclassContentHandlerImplimplementsContentHandler /*/* *文檔開始事件 */publicvoidstartDocument()throwsSAXException System.out.println(); /*/* *接收處理指令事件 */publicvoidprocessingInstruction(Str
14、ingtarget,Stringdata)throwsSAXException System.out.println(); /*/* *元素開始事件 *參數(shù)說明: *uri-名稱空間URI,如果元素沒有任何名稱空間URI,或者沒有正在執(zhí)行名稱空間處理,則為空字符串。 *localName-本地名稱(不帶前綴),如果沒有正在執(zhí)行名稱空間處理,則為空字符串。 *qName-限定的名稱(帶有前綴),如果限定的名稱不可用,則為空字符串。 *attributes-附加到元素的屬性。如果沒有屬性,則它將是空的Attributes對象。 */publicvoidstartElement(Stringuri,
15、StringlocalName,StringqName,Attributesattrs)throwsSAXException System.out.print(+qName);/輸出元素名稱 intlen=attrs.getLength();/元素屬性列表長度 /利用循環(huán)輸出屬性列表 for(inti=0;i); /*/* *元素中字符數(shù)據(jù)事件:接收元素中字符數(shù)據(jù) *注意:1.應(yīng)用程序不要試圖讀取ch數(shù)組指定范圍外的數(shù)據(jù),(即start至length之外) *2.有些解析器將使用ignorableWhitespace()方法來報告元素內(nèi)容中的空白,而不是characters()方法,如:進行有
16、效性驗證的解析器 */publicvoidcharacters(charch,intstart,intlength)throwsSAXException System.out.print(newString(ch,start,length); /*/* *結(jié)束元素事件 */publicvoidendElement(Stringuri,StringlocalName,StringqName)throwsSAXException System.out.print(); publicvoidendDocument()throwsSAXException publicvoidendPrefixMapp
17、ing(Stringprefix)throwsSAXException publicvoidignorableWhitespace(charch,intstart,intlength)throwsSAXException publicvoidsetDocumentLocator(Locatorlocator) publicvoidskippedEntity(Stringname)throwsSAXException publicvoidstartPrefixMapping(Stringprefix,Stringuri)throwsSAXException import org.xml.sax.
18、Attributes;import org.xml.sax.ContentHandler;import org.xml.sax.Locator;import org.xml.sax.SAXException;public class ContentHandlerImpl implements ContentHandler /* */* * 文檔開始事件 */ public void startDocument() throws SAXException System.out.println(); /* */* * 接收處理指令事件 */ public void processingInstru
19、ction(String target, String data) throws SAXException System.out.println(); /* */* * 元素開始事件 * 參數(shù)說明: * uri - 名稱空間 URI,如果元素沒有任何名稱空間 URI,或者沒有正在執(zhí)行名稱空間處理,則為空字符串。 * localName - 本地名稱(不帶前綴),如果沒有正在執(zhí)行名稱空間處理,則為空字符串。 * qName - 限定的名稱(帶有前綴),如果限定的名稱不可用,則為空字符串。 * attributes - 附加到元素的屬性。如果沒有屬性,則它將是空的 Attributes 對象。 *
20、/ public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException System.out.print(+qName);/輸出元素名稱 int len=attrs.getLength();/元素屬性列表長度 /利用循環(huán)輸出屬性列表 for(int i=0;i); /* */* * 元素中字符數(shù)據(jù)事件:接收元素中字符數(shù)據(jù) * 注意:1.應(yīng)用程序不要試圖讀取ch數(shù)組指定范圍外的數(shù)據(jù),(即start至length之外) * 2.有些解析器將使用ignor
21、ableWhitespace()方法來報告元素內(nèi)容中的空白,而不是characters()方法,如:進行有效性驗證的解析器 */ public void characters(char ch, int start, int length) throws SAXException System.out.print(new String(ch,start,length); /* */* * 結(jié)束元素事件 */ public void endElement(String uri, String localName, String qName) throws SAXException System.o
22、ut.print(); public void endDocument() throws SAXException public void endPrefixMapping(String prefix) throws SAXException public void ignorableWhitespace(char ch, int start, int length) throws SAXException public void setDocumentLocator(Locator locator) public void skippedEntity(String name) throws
23、SAXException public void startPrefixMapping(String prefix, String uri) throws SAXException ErrorHandlerImpl.java Java代碼 publicclassErrorHandlerImplimplementsErrorHandler publicvoidwarning(SAXParseExceptione)throwsSAXException System.out.println(Warning+getLocationString(e)+:+e.getMessage(); publicvo
24、iderror(SAXParseExceptione)throwsSAXException System.out.println(Error+getLocationString(e)+:+e.getMessage(); publicvoidfatalError(SAXParseExceptione)throwsSAXException System.out.println(FatalError+getLocationString(e)+:+e.getMessage(); privateStringgetLocationString(SAXParseExceptione) StringBuffe
25、rsb=newStringBuffer(); StringpublicId=e.getPublicId(); if(publicId!=null) sb.append(publicId); sb.append(); StringsystemId=e.getSystemId(); if(systemId!=null) sb.append(systemId); sb.append(); sb.append(e.getLineNumber(); sb.append(:); sb.append(e.getColumnNumber(); returnsb.toString(); 1. public cl
26、ass ErrorHandlerImpl implements ErrorHandler public void warning(SAXParseException e) throws SAXException System.out.println(Warning +getLocationString(e)+:+e.getMessage(); public void error(SAXParseException e) throws SAXException System.out.println(Error +getLocationString(e)+:+e.getMessage(); pub
27、lic void fatalError(SAXParseException e) throws SAXException System.out.println(Fatal Error +getLocationString(e)+:+e.getMessage(); private String getLocationString(SAXParseException e) StringBuffer sb=new StringBuffer(); String publicId=e.getPublicId(); if(publicId!=null) sb.append(publicId); sb.ap
28、pend( ); String systemId=e.getSystemId(); if(systemId!=null) sb.append(systemId); sb.append( ); sb.append(e.getLineNumber(); sb.append(:); sb.append(e.getColumnNumber(); return sb.toString(); SaxParserTest.java Java代碼 importjava.io.FileInputStream; importorg.xml.sax.InputSource; importorg.xml.sax.XM
29、LReader; importorg.xml.sax.helpers.XMLReaderFactory; publicclassSaxParserTest publicstaticvoidmain(Stringargs) try XMLReaderxmlReader=XMLReaderFactory.createXMLReader(); /關(guān)閉或打開驗證 xmlReader.setFeature(/sax/features/validation,true); /注冊事件處理器 xmlReader.setContentHandler(newContentHandlerI
30、mpl(); /注冊異常處理器 xmlReader.setErrorHandler(newErrorHandlerImpl(); xmlReader.parse(newInputSource(newFileInputStream(saxdb.xml); catch(Exceptione) System.out.println(e.getMessage(); import java.io.FileInputStream;import org.xml.sax.InputSource;import org.xml.sax.XMLReader;import org.xml.sax.helpers.XM
31、LReaderFactory;public class SaxParserTest public static void main(String args) try XMLReader xmlReader=XMLReaderFactory.createXMLReader(); /關(guān)閉或打開驗證 xmlReader.setFeature(/sax/features/validation,true); /注冊事件處理器 xmlReader.setContentHandler(new ContentHandlerImpl(); /注冊異常處理器 xmlReader.setE
32、rrorHandler(new ErrorHandlerImpl(); xmlReader.parse(new InputSource(new FileInputStream(saxdb.xml); catch (Exception e) System.out.println(e.getMessage(); 第二種:DOM解析DOM中的核心概念就是節(jié)點。DOM在分析XML文檔時,將將組成XML文檔的各個部分(元素、屬性、文本、注釋、處理指令等)映射為一個對象(節(jié)點)。在內(nèi)存中,這些節(jié)點形成一課文檔樹。整棵樹是一個節(jié)點,樹中的每一個節(jié)點也是一棵樹(子樹),可以說,DOM就是對這棵樹的一個對象描述
33、,我們通過訪問樹中的節(jié)點來存取XML文檔的內(nèi)容。PS:屬性節(jié)點是附屬于元素的,不能被看做是元素的子節(jié)點,更不能作為一個單獨的節(jié)點DOMPrinter.javaJava代碼 importorg.w3c.dom.Document; importorg.w3c.dom.NamedNodeMap; importorg.w3c.dom.Node; ernal.parsers.DOMParser; publicclassDOMPrinter publicstaticvoidmain(Stringargs) try /*/*獲取Docum
34、ent對象*/DOMParserparser=newDOMParser(); parser.parse(db.xml); Documentdocument=parser.getDocument(); printNode(document); catch(Exceptione) e.printStackTrace(); publicstaticvoidprintNode(Nodenode) shortnodeType=node.getNodeType(); switch(nodeType) caseNode.PROCESSING_INSTRUCTION_NODE:/預(yù)處理指令類型 printNo
35、deInfo(node); break; caseNode.ELEMENT_NODE:/元素節(jié)點類型 printNodeInfo(node); printAttribute(node); break; caseNode.TEXT_NODE:/文本節(jié)點類型 printNodeInfo(node); break; default: break; Nodechild=node.getFirstChild(); while(child!=null) printNode(child); child=child.getNextSibling(); /*/* *根據(jù)節(jié)點類型打印節(jié)點 *paramnode *
36、/publicstaticvoidprintNodeInfo(Nodenode) if(node.getNodeType()=Node.ELEMENT_NODE) System.out.println(NodeName:+node.getNodeName(); elseif(node.getNodeType()=Node.TEXT_NODE) Stringvalue=node.getNodeValue().trim(); if(!value.equals() System.out.println(NodeValue:+value); elseSystem.out.println(); else
37、 System.out.println(node.getNodeName()+:+node.getNodeValue(); /*/* *打印節(jié)點屬性 *paramaNode節(jié)點 */publicstaticvoidprintAttribute(NodeaNode) NamedNodeMapattrs=aNode.getAttributes(); if(attrs!=null) for(inti=0;iattrs.getLength();i+) NodeattNode=attrs.item(i); System.out.println(Attribute:+attNode.getNodeName
38、()+=+attNode.getNodeValue()+); import org.w3c.dom.Document;import org.w3c.dom.NamedNodeMap;import org.w3c.dom.Node;import ernal.parsers.DOMParser;public class DOMPrinter public static void main(String args) try /* */* 獲取Document對象 */ DOMParser parser = new DOMParser(); parser.parse(db.xml); Document document = parser.getDocument(); printNode(document); catch (Exception e) e.printStackTrace(); pu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 甘孜甘孜州經(jīng)濟和信息化局招聘3名企業(yè)之家服務(wù)大廳工作人員筆試歷年參考題庫附帶答案詳解
- 北京北京市體育局所屬事業(yè)單位招聘100人筆試歷年參考題庫附帶答案詳解
- 中央中共中央對外聯(lián)絡(luò)部事業(yè)單位2025年招聘5人筆試歷年參考題庫附帶答案詳解
- 2026年及未來5年中國軌道交通裝備行業(yè)市場調(diào)研分析及投資戰(zhàn)略咨詢報告
- 2025年河北邢臺市中心血站第二批公開招聘編外工作人員1名筆試備考試題及答案解析
- 2026安徽淮南市壽縣楚通公共交通有限公司就業(yè)見習(xí)招聘2人筆試參考題庫及答案解析
- 2026興業(yè)銀行南昌分行招聘10人筆試備考題庫及答案解析
- 2026上海銀行分支行社會招聘筆試模擬試題及答案解析
- 2026安徽安慶市人力資源服務(wù)有限公司招聘勞務(wù)派遣員工4人筆試備考試題及答案解析
- 2025年家庭養(yǎng)老支持政策優(yōu)化報告
- DB31∕T 1048-2020“上海品牌”認證通 用要求
- 意識障礙的判斷及護理
- 儲能電站安全管理與操作規(guī)程
- 病理性賭博的識別和干預(yù)
- 2025年宿遷市泗陽縣保安員招聘考試題庫附答案解析
- 校園文化建設(shè)協(xié)議合同
- 2025年廣東省中考物理試卷及答案
- 2026屆高三語文聯(lián)考作文題目導(dǎo)寫分析及范文:當(dāng)語言與真實經(jīng)驗脫鉤
- 皮革項目商業(yè)計劃書
- 公路護欄波型梁施工方案
- 《聽力考試室技術(shù)規(guī)范》
評論
0/150
提交評論