(I)Java通過(guò)DOM解析XML
1>得到DOM解析器的工廠實(shí)例 DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance(); 得到j(luò)avax.xml.parsers.DocumentBuilderFactory;類的實(shí)例就是我們要的解析器工廠 2>從DOM工廠獲得DOM解析器 DocumentBuilder dombuilder=domfac.newDocumentBuilder(); 通過(guò)javax.xml.parsers.DocumentBuilderFactory實(shí)例的靜態(tài)方法newDocumentBuilder()得到DOM解析器 3>把要解析的XML文檔轉(zhuǎn)化為輸入流,以便DOM解析器解析它 InputStream is=new FileInputStream("bin/library.xml"); InputStream是一個(gè)接口。
4>解析XML文檔的輸入流,得到一個(gè)Document Document doc=dombuilder.parse(is); 由XML文檔的輸入流得到一個(gè)org.w3c.dom.Document對(duì)象,以后的處理都是對(duì)Document對(duì)象進(jìn)行的 5>得到XML文檔的根節(jié)點(diǎn) Element root=doc.getDocumentElement(); 在DOM中只有根節(jié)點(diǎn)是一個(gè)org.w3c.dom.Element對(duì)象。 6>得到節(jié)點(diǎn)的子節(jié)點(diǎn) NodeList books=root.getChildNodes(); for(int i=0;i<books.getLength();i++){ Node book=books.item(i); } 這是用一個(gè)org.w3c.dom.NodeList接口來(lái)存放它所有子節(jié)點(diǎn)的,還有一種輪循子節(jié)點(diǎn)的方法,后面有介紹 7>取得節(jié)點(diǎn)的屬性值 String email=book.getAttributes().getNamedItem("email").getNodeValue(); System.out.println(email); 注意,節(jié)點(diǎn)的屬性也是它的子節(jié)點(diǎn)。它的節(jié)點(diǎn)類型也是Node.ELEMENT_NODE 8>輪循子節(jié)點(diǎn) for(Node node=book.getFirstChild();node!=null;node=node.getNextSibling()){ if(node.getNodeType()==Node.ELEMENT_NODE){ if(node.getNodeName().equals("name")){ String name=node.getNodeValue(); String name1=node.getFirstChild().getNodeValue(); ... if(node.getNodeName().equals("price")){ String price=node.getFirstChild().getNodeValue(); ...
- <span style="font-family: courier new,courier; font-size: small;"><?xml version="1.0" encoding="UTF-8"?>
- <xml>
- <conn-params>
- <conn-url>jdbc:mysql:
- <conn-driver>com.mysql.jdbc.Driver</conn-driver>
- <conn-username>root</conn-username>
- <conn-password>root</conn-password>
- </conn-params>
-
- <person>
- <user>
- <username>xzc</username>
- <password>sdf23223</password>
- <birthday>2012-01-23</birthday>
- </user>
- <user>
- <username>誤闖</username>
- <password>wuchuang3223</password>
- <birthday>2002-01-03</birthday>
- </user>
- </person>
- </xml> </span>
////////////////////////////////////////////////////////////////////////////////////
- <span style="font-family: courier new,courier; font-size: small;">package com.xcz.xml;
-
- import java.io.File;
- import java.io.IOException;
- import java.util.List;
-
- import javax.xml.parsers.ParserConfigurationException;
-
- import org.xml.sax.SAXException;
-
- import com.xcz.po.User;
- import com.xcz.xml.util.DomUtil;
-
- public class Dom4Xml {
-
- private DomUtil domUtil = new DomUtil();
-
- public static void main(String[] args) {
- try {
- File f = new File("src/jdbc-params.xml");
- List<User> list = new Dom4Xml().domUtil.parseXml(f);
- for (User user : list) {
- System.out.println(user);
- }
- } catch (ParserConfigurationException e) {
- e.printStackTrace();
- } catch (SAXException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- }
- } </span>
////////////////////////////////////////////////////////////////////////////////////
(II)Java通過(guò)SAX解析XML Simple API for XML(簡(jiǎn)稱SAX)是個(gè)循序存取XML的解析器API。 一個(gè)實(shí)現(xiàn)SAX的解析器(也就是“SAX Parser”)以一個(gè)串流解析器的型式作用,擁有事件驅(qū)動(dòng)API。由使用者定義回調(diào)函數(shù),解析時(shí),若發(fā)生事件的話會(huì)被調(diào)用。SAX事件包括: - XML 文字 節(jié)點(diǎn)
- XML 元素 節(jié)點(diǎn)
- XML 處理指令
- XML 注釋
- <person>
- <user>
- <username>謝成志</username>
- <password>6626310xie</password>
- <sex>男</sex>
- <birthday>1988/11/28</birthday>
- <headpic>
- <pictitle>ermao</pictitle>
- <picurl>images/head1.jpg</picurl>
- </headpic>
- </user>
- </person>
此為下面即將解析度簡(jiǎn)單xml結(jié)構(gòu),并將其封裝成一個(gè)User對(duì)象。
////////////////////////////////////////////////////////////////////////////////////
- <span style="font-family: courier new,courier; font-size: small;">package com.xcz.xml;
-
- import java.io.File;
- import java.io.IOException;
-
- import javax.xml.parsers.ParserConfigurationException;
- import javax.xml.parsers.SAXParser;
- import javax.xml.parsers.SAXParserFactory;
-
- import org.xml.sax.SAXException;
-
- import com.xcz.util.SaxUtil;
-
- public class Sax4XML {
-
- public static void main(String[] args) {
-
- try {
-
- SAXParserFactory factory = SAXParserFactory.newInstance();
-
- SAXParser parser = factory.newSAXParser();
-
- SaxUtil su = new SaxUtil();
-
- parser.parse(new File("src/user-params.xml"), su);
-
- System.out.println(su.getUser());
-
- } catch (ParserConfigurationException e) {
- e.printStackTrace();
- } catch (SAXException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- }
- }
- </span>
////////////////////////////////////////////////////////////////////////////////////
- <span style="font-family: courier new,courier; font-size: small;">package com.xcz.util;
-
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
-
- import org.xml.sax.Attributes;
- import org.xml.sax.SAXException;
- import org.xml.sax.helpers.DefaultHandler;
-
- import com.xcz.po.HeadPic;
- import com.xcz.po.User;
-
-
-
-
-
-
-
- public class SaxUtil extends DefaultHandler {
-
- private User user;
- private HeadPic headPic;
- private String content;
- private SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
-
- @Override
- public void characters(char[] ch, int start, int length)
- throws SAXException {
- content = new String(ch, start, length);
- }
-
-
- @Override
- public void startDocument() throws SAXException {
- super.startDocument();
- }
-
-
- @Override
- public void endDocument() throws SAXException {
- super.endDocument();
- }
-
-
- @Override
- public void startElement(String uri, String localName, String name,
- Attributes attributes) throws SAXException
- {
- if("user".equals(name))
- {
- user = new User();
- }
- if("headpic".equals(name))
- {
- headPic = new HeadPic();
- }
- }
-
-
- @Override
- public void endElement(String uri, String localName, String name)
- throws SAXException
- {
- if("username".equals(name))
- {
- user.setUsername(content);
- }
- if("password".equals(name))
- {
- user.setPassword(content);
- }
- if("sex".equals(name))
- {
- user.setSex(content);
- }
- if("birthday".equals(name))
- {
- try {
- user.setBirthday(sdf.parse(content));
- } catch (ParseException e) {
-
- e.printStackTrace();
- }
- }
- if("pictitle".equals(name))
- {
- headPic.setPicTitle(content);
- }
- if("picurl".equals(name))
- {
- headPic.setPicUrl(content);
- user.setHeadPic(headPic);
- }
-
- }
-
- public User getUser(){
- return user;
- }
-
- }</span>
[優(yōu)點(diǎn)]
(1).節(jié)約內(nèi)存開銷
SAX解析器在某些方面優(yōu)于DOM風(fēng)格解析器,因?yàn)镾AX解析器的內(nèi)存使用量一般遠(yuǎn)低于DOM解析器使用量。DOM解析器在任何處理開始之前,必須將xml以整棵樹放在內(nèi)存,所以DOM解析器的內(nèi)存使用量完全根據(jù)輸入資料的大小。相對(duì)來(lái)說(shuō),SAX解析器的內(nèi)存內(nèi)容,是只基于XML檔案的最大深度(XML樹的最大深度)和單一XML項(xiàng)目上XML屬性儲(chǔ)存的最大資料。
(2)解析速度快
因?yàn)镾AX事件驅(qū)動(dòng)的本質(zhì),處理文件通常會(huì)比DOM風(fēng)格的解析器快。
[缺點(diǎn)]
SAX事件驅(qū)動(dòng)的模型對(duì)于XML解析很有用,但它確實(shí)有某些缺點(diǎn)。
某些種類的XML驗(yàn)證需要存取整份文件。例如,一個(gè)DTD IDREF屬性需要文件內(nèi)有項(xiàng)目使用指定字串當(dāng)成DTD ID屬性。要在SAX解析器內(nèi)驗(yàn)證,必須追蹤每個(gè)之前遇過(guò)的ID和IDREF屬性,檢查是否有任何相符。更甚者,一個(gè)IDREF找不到對(duì)應(yīng)的ID,使用者只會(huì)在整份文件都解析完后才發(fā)現(xiàn),若這種連結(jié)對(duì)于建立有效輸出是重要的,那用在處理整份文件的時(shí)間只是浪費(fèi)。
另外,某些XML處理僅要求存取整份文件。舉例來(lái)說(shuō),XSLT及XPath需要能夠任何時(shí)間存取任何解析過(guò)的XML樹。當(dāng)SAX以用來(lái)建構(gòu)此樹時(shí),DOM解析器在設(shè)計(jì)上已經(jīng)是如此了。
|