這篇文章主要介紹了XML解析的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
成都創(chuàng)新互聯(lián)公司是專業(yè)的欒川網(wǎng)站建設(shè)公司,欒川接單;提供成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行欒川網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
在項目開發(fā)中,HTML的主要功能是進行數(shù)據(jù)展示,而要進行數(shù)據(jù)存儲結(jié)構(gòu)的規(guī)范化就需要使用XML。XML有自己的語法,而且所有的標記元素都可以由用戶任意定義。
XML(eXtended Markup Language,可擴展的標記性語言)提供了一套跨平臺、跨網(wǎng)絡(luò)、跨程序的語言的數(shù)據(jù)描述方式,使用XML可以方便地實現(xiàn)數(shù)據(jù)交換、系統(tǒng)配置、內(nèi)容管理等常見功能。
XML與HTML類似,都屬于標記性語言。最大的不同時HTML中的元素都是固定的,且以顯示為主,而XML語言中的標記都是由用戶自定義的,主要以數(shù)據(jù)保存為主。
XML和HTML的比較
實際上所有的XML文件都由前導(dǎo)區(qū)和數(shù)據(jù)區(qū)兩部分組成。
前導(dǎo)區(qū):規(guī)定出XML頁面的一些屬性,有以下3個屬性:
version:表示使用的XML版本,現(xiàn)在是1.0。
encoding:頁面中使用的文字編碼,如果有中文,則一定要指定編碼。
standalone:此XML文件是否是獨立運行,如果需要進行顯示可以使用CSS或XSL控制。
屬性出現(xiàn)的順序是固定的,version、encoding、standalone,一旦順序不對,XML將出現(xiàn)錯誤。
<?xml version="1.0" encoding="GB2312" standalone="no"?>數(shù)據(jù)區(qū):所有的數(shù)據(jù)區(qū)必須有一個根元素,一個根元素下可以存放多個子元素,但是要求每一個元素必須完結(jié),每一個標記都是區(qū)分大小寫的。
XML語言中提供了CDATA標記來標識文件數(shù)據(jù),當XML解析器處理到CDATA標記時,它不會解析該段數(shù)據(jù)中的任何符號或標記,只是將原數(shù)據(jù)原封不動的傳遞給應(yīng)用程序。
CDATA語法格式:
<![CDATA[] 不解析內(nèi)容 ]>
在XML文件中由于更多的是描述信息的內(nèi)容,所以在得到一個XML文檔后用該利用程序按照其中元素的定義名稱取出對應(yīng)的內(nèi)容,這樣的操作就稱為XML解析。
在XML解析中W3C定義了SAX和DOM兩種解析方式,這兩種解析方式的程序操作如下:
XML解析操作
可以看出,應(yīng)用程序不是直接對XML文檔進行操作的,而是首先由XML分析器對XML文檔進行分析,然后應(yīng)用程序通過XML分析器所提供的DOM接口或SAX接口對分析結(jié)構(gòu)進行操作,從而間接地實現(xiàn)了對XML文檔的訪問。
2.1、DOM解析操作
在應(yīng)用程序中,基于DOM (Document Object Model,文檔對象模型)的XML分析器將一個XML文檔轉(zhuǎn)換成一個對象模型的集合(通常稱為DOM樹),應(yīng)用程勛正是通過對這個對象模型的操作,來實現(xiàn)對XML文檔數(shù)據(jù)的操作。通過DOM接口,應(yīng)用程序可以在任何時候訪問XML文檔中的任何一部分數(shù)據(jù),因此,這種這種利用DOM接口的機制也被稱作隨機訪問機制。
由于DOM分析器把整個XML文檔轉(zhuǎn)化成DOM樹放在了內(nèi)存中,因此,當文檔比較大或者結(jié)構(gòu)比較復(fù)雜時,對內(nèi)存的需求就比較高,而且對于結(jié)構(gòu)復(fù)雜的樹的遍歷也是一項耗時的操作。
DOM操作會在內(nèi)存中將所有的XML文件變?yōu)镈OM樹。
在DOM解析中有以下4個核心的操作接口:
Document:此接口代表了整個XML文檔,表示整個DOM樹的根,提供了對文檔中的數(shù)據(jù)進行訪問和操作的入口,通過Document節(jié)點可以訪問XML文件中所有的元素內(nèi)容。
Document接口的常用方法
Node:DOM操作的核心接口中有很大一部分是從Node接口繼承過來的。例如Document、Element、Attri等接口。在DOM樹中,每一個Node接口代表了DOM樹中的一個節(jié)點。
Node接口的常用方法
NodeList:此接口表示一個節(jié)點的集合,一般用于表示有順序關(guān)系的一組節(jié)點。例如,一個節(jié)點的子節(jié)點,當文檔改變時會直接 影響到NodeList集合。
NodeList接口的常用方法
NameNodeMap:此接口表示一組節(jié)點和其唯一名稱對應(yīng)的一一對應(yīng)關(guān)系,主要用于屬性節(jié)點的表示。
出以上4個核心接口外,如果一個程序需要進行DOM解析讀操作,則需要按如下步驟進行:
(1)建立DocumentBuilderFactory:DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
(2)建立DocumentBuilder:DocumentBuilder builder = factory.newDocumentBuilder();
(3)建立Document:Document doc= builder.parse("要讀取的文件路徑");
(4)建立NodeList:NodeList nl = doc.getElementsByTagName("讀取節(jié)點");
(5)進行XML信息讀取。
// xml_demo.xml <?xml version="1.0" encoding="GBK"?> <addresslist> <linkman> <name>小明</name> <email>asaasa@163.com</email> </linkman> <linkman> <name>小張</name> <email>xiaoli@163.com</email> </linkman> </addresslist>
DOM完成XML的讀取。
package com.demo; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class XmlDomDemo { public static void main(String[] args) { // (1)建立DocumentBuilderFactory,以用于取得DocumentBuilder DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // (2)通過DocumentBuilderFactory,取得DocumentBuilder DocumentBuilder builder = null; try { builder = factory.newDocumentBuilder(); } catch (ParserConfigurationException e) { e.printStackTrace(); } // (3)定義Document接口對象,通過DocumentBuilder類進行DOM樹是轉(zhuǎn)換操作 Document doc = null; try { // 讀取指定路徑的XML文件,讀取到內(nèi)存中 doc = builder.parse("xml_demo.xml"); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // (4)查找linkman節(jié)點 NodeList nl = doc.getElementsByTagName("linkman"); // (5)輸出NodeList中第一個子節(jié)點中文本節(jié)點的內(nèi)容 for (int i = 0; i < nl.getLength(); i++) { // 取出每一個元素 Element element = (Element) nl.item(i); System.out.println("姓名:" + element.getElementsByTagName("name").item(0).getFirstChild().getNodeValue()); System.out.println("郵箱:" + element.getElementsByTagName("email").item(0).getFirstChild().getNodeValue()); } } }
DOM完成XML的文件輸出。
此時就需要使用DOM操作中提供的各個接口(如Element接口)并手工設(shè)置各個節(jié)點的關(guān)系,同時在創(chuàng)建Document對象時就必須使用newDocument()方法建立一個新的DOM樹。
如果現(xiàn)在需要將XML文件保存在硬盤上,則需要使用TransformerFactory、Transformer、DOMSource、StreamResult 4個類完成。
TransformerFactory類:取得一個Transformer類的實例對象。
DOMSource類:接收Document對象。
StreamResult 類:指定要使用的輸出流對象(可以向文件輸出,也可以向指定的輸出流輸出)。
Transformer類:通過該類完成內(nèi)容的輸出。
StreamResult類的構(gòu)造方法
package com.demo; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; public class XmlDemoWrite { public static void main(String[] args) { // (1)建立DocumentBuilderFactory,以用于取得DocumentBuilder DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // (2)通過DocumentBuilderFactory,取得DocumentBuilder DocumentBuilder builder = null; try { builder = factory.newDocumentBuilder(); } catch (ParserConfigurationException e) { e.printStackTrace(); } // (3)定義Document接口對象,通過DocumentBuilder類進行DOM樹是轉(zhuǎn)換操作 Document doc = null; // 創(chuàng)建一個新的文檔 doc = builder.newDocument(); // (4)建立各個操作節(jié)點 Element addresslist = doc.createElement("addresslist"); Element linkman = doc.createElement("linkman"); Element name = doc.createElement("name"); Element email = doc.createElement("email"); // (5)設(shè)置節(jié)點的文本內(nèi)容,即為每一個節(jié)點添加文本節(jié)點 name.appendChild(doc.createTextNode("小明")); email.appendChild(doc.createTextNode("xiaoming@163.com")); // (6)設(shè)置節(jié)點關(guān)系 linkman.appendChild(name); linkman.appendChild(email); addresslist.appendChild(linkman); doc.appendChild(addresslist); // (7)輸出文檔到文件中 TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = null; try { t = tf.newTransformer(); } catch (TransformerConfigurationException e) { e.printStackTrace(); } // 設(shè)置編碼 t.setOutputProperty(OutputKeys.ENCODING, "GBK"); // 輸出文檔 DOMSource source = new DOMSource(doc); // 指定輸出位置 StreamResult result = new StreamResult(new File("xml_wirte.xml")); try { // 輸出 t.transform(source, result); System.out.println("yes"); } catch (TransformerException e) { e.printStackTrace(); } } }
生成文檔:
//xml_write.xml <?xml version="1.0" encoding="GBK" standalone="no"?> <addresslist> <linkman> <name>小明</name> <email>xiaoming@163.com</email> </linkman> </addresslist>
2.2、SAX解析操作
SAX(Simple APIs for XML,操作XML的簡單接口)與DOM操作不同的是,SAX采用的是一種順序的模式進行訪問,是一種快速讀取XML數(shù)據(jù)的方式。
當使用SAX 解析器進行操作時會觸發(fā)一系列的事件。
SAX主要事件
當掃描到文檔(Document)開始與結(jié)束、元素(Element)開始與結(jié)束時都會調(diào)用相關(guān)的處理方法,并由這些操作方法做出相應(yīng)的操作,直到整個文檔掃描結(jié)束。
如果在開發(fā)中想要使用SAX解析,則首先應(yīng)該編寫一個SAX解析器,再直接定義一個類,并使該類繼承自DefaultHandler類,同時覆寫上述的表中的方法即可。
package com.sax.demo; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class XmlSax extends DefaultHandler { @Override public void startDocument() throws SAXException { System.out.println("<?xml version=\"1.0\" encoding=\"GBK\"?>"); } @Override public void endDocument() throws SAXException { System.out.println("\n 文檔讀取結(jié)束。。。"); } @Override public void startElement(String url, String localName, String name, Attributes attributes) throws SAXException { System.out.print("<"); System.out.print(name); if (attributes != null) { for (int x = 0; x < attributes.getLength(); x++) { System.out.print("" + attributes.getQName(x) + "=\"" + attributes.getValue(x) + "\""); } } System.out.print(">"); } @Override public void characters(char[] ch, int start, int length) throws SAXException { System.out.print(new String(ch, start, length)); } @Override public void endElement(String url, String localName, String name) throws SAXException { System.out.print("</"); System.out.print(name); System.out.print(">"); } }
建荔灣SAX解析器后,還需要建立SAXParserFactory和SAXParser對象,之后通過SAXPaeser的parse()方法指定要解析的XML文件和指定的SAX解析器。
建立要讀取的文件:sax_demo.xml
<?xml version="1.0" encoding="GBK"?> <addresslist> <linkman id="xm"> <name>小明</name> <email>xiaoming@163.com</email> </linkman> <linkman id="xl"> <name>小李</name> <email>xiaoli@163.com</email> </linkman> </addresslist>
使用SAX解析器
package com.sax.demo; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; public class SaxTest { public static void main(String[] args) throws Exception { //(1)建立SAX解析工廠 SAXParserFactory factory = SAXParserFactory.newInstance(); //(2)構(gòu)造解析器 SAXParser parser = factory.newSAXParser(); //(3)解析XML使用handler parser.parse("sax_demo.xml", new XmlSax()); } }
通過上面的程序可以發(fā)現(xiàn),使用SAX解析比使用DOM解析更加容易。
DOM解析與SAX解析的區(qū)別
有兩者的特點可以發(fā)現(xiàn)兩者的區(qū)別:
DOM解析適合于對文件進行修改和隨機存取的操作,但是不適合于大型文件的操作。
SAX采用部分讀取的方式,所以可以處理大型文件,而且只需要從文件中讀取特定內(nèi)容。SAX解析可以由用戶自己建立自己的對象模型。
2.3、XML解析的好幫手:jdom
jdom是使用Java編寫的,用于讀、寫、操作XML的一套組件。
jdom = dom 修改文件的有點 + SAX讀取快速的優(yōu)點
jdom的主要操作類
使用jdom生成XML文件
package com.jdom.demo; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import org.jdom.Attribute; import org.jdom.Document; import org.jdom.Element; import org.jdom.output.XMLOutputter; public class WriteXml { public static void main(String[] args) { // 定義節(jié)點 Element addresslist = new Element("addresslist"); Element linkman = new Element("linkman"); Element name = new Element("name"); Element email = new Element("email"); // 定義屬性 Attribute id = new Attribute("id", "xm"); // 聲明一個Document對象 Document doc = new Document(addresslist); // 設(shè)置元素的內(nèi)容 name.setText("小明"); email.setText("xiaoming@163.com"); name.setAttribute(id); // 設(shè)置子節(jié)點 linkman.addContent(name); linkman.addContent(email); // 將linkman加入根子節(jié)點 addresslist.addContent(linkman); // 用來輸出XML文件 XMLOutputter out = new XMLOutputter(); // 設(shè)置輸出編碼 out.setFormat(out.getFormat().setEncoding("GBK")); // 輸出XML文件 try { out.output(doc, new FileOutputStream("jdom_write.xml")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
// jdom_write.xml <?xml version="1.0" encoding="GBK"?> <addresslist> <linkman> <name id="xm">小明</name> <email>xiaoming@163.com</email> </linkman> </addresslist>
使用jdom讀取XML文件
package com.jdom.demo; import java.io.IOException; import java.util.List; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; public class ReadXml { public static void main(String[] args) throws JDOMException, IOException { //建立SAX解析 SAXBuilder builder = new SAXBuilder(); //找到Document Document readDoc = builder.build("jdom_write.xml"); //讀取根元素 Element stu = readDoc.getRootElement(); //得到全部linkman子元素 List list = stu.getChildren("linkman"); for (int i = 0; i < list.size(); i++) { Element e = (Element) list.get(i); String name = e.getChildText("name"); String id = e.getChild("name").getAttribute("id").getValue(); String email = e.getChildText("email"); System.out.println("----聯(lián)系人----"); System.out.println("姓名:" + name + "編號:" + id); System.out.println("Email:" + email); } } }
jdom是一種常見的操作組件
在實際的開發(fā)中使用非常廣泛。
2.4、解析工具:dom4j
dom4j也是一組XML操作組件包,主要用來讀寫XML文件,由于dom4j性能優(yōu)異、功能強大,且具有易用性,所以現(xiàn)在已經(jīng)被廣泛地應(yīng)用開來。如,Hibernate、Spring框架中都使用了dom4j進行XML的解析操作。
開發(fā)時需要引入的jar包:dom4j-1.6.1.jar、lib/jaxen-1.1-beta-6.jar
dom4j中的所用操作接口都在org.dom4j包中定義。其他包根據(jù)需要把選擇使用。
dom4j的主要接口
用dom4j生成XML文件:
package com.dom4j.demo; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; public class Dom4jWrite { public static void main(String[] args) { // 創(chuàng)建文檔 Document doc = DocumentHelper.createDocument(); // 定義個節(jié)點 Element addresslist = doc.addElement("addresslist"); Element linkman = addresslist.addElement("linkman"); Element name = linkman.addElement("name"); Element email = linkman.addElement("email"); // 設(shè)置節(jié)點內(nèi)容 name.setText("小明"); email.setText("xiaoming@163.com"); // 設(shè)置輸出格式 OutputFormat format = OutputFormat.createPrettyPrint(); // 指定輸出編碼 format.setEncoding("GBK"); try { XMLWriter writer = new XMLWriter(new FileOutputStream(new File( "dom4j_demo.xml")), format); writer.write(doc); writer.close(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
// dom4j_demo.xml <?xml version="1.0" encoding="GBK"?> <addresslist> <linkman> <name>小明</name> <email>xiaoming@163.com</email> </linkman> </addresslist>
用dom4j讀取XML文件:
package com.dom4j.demo; import java.io.File; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class Dom4jRead { public static void main(String[] args) { //讀取文件 File file = new File("dom4j_demo.xml"); //建立SAX解析讀取 SAXReader reader = new SAXReader(); Document doc = null; try { //讀取文檔 doc = reader.read(file); } catch (DocumentException e) { e.printStackTrace(); } //取得根元素 Element root = doc.getRootElement(); //取得全部的子節(jié)點 Iterator iter = root.elementIterator(); while (iter.hasNext()) { //取得每一個linkman Element linkman = (Element) iter.next(); System.out.println("姓名:"+linkman.elementText("name")); System.out.println("郵件地址:"+linkman.elementText("email")); } } }
感謝你能夠認真閱讀完這篇文章,希望小編分享的“XML解析的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
新聞標題:XML解析的示例分析
本文路徑:http://jinyejixie.com/article36/ghhesg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、網(wǎng)頁設(shè)計公司、網(wǎng)站營銷、外貿(mào)建站、移動網(wǎng)站建設(shè)、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)