1:DOM實例
示例XML文件message.xml:
<?xml version="1.0" encoding="UTF-8"?>
<messages>
<message>電影:七劍主演:甄子丹</message>
<message>電影:神話主演:成龍</message>
<message>電影:世界大戰主演:湯姆克魯斯</message>
<message>電影:喜馬拉雅星主演:吳鎮宇</message>
</messages>
JSP頁面:
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%@ page import="javax.xml.parsers.*,org.w3c.dom.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Dom讀取XML文件</title>
</head>
<body>
<%DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
Document doc=db.parse("f:/message.xml");
NodeList nl=doc.getElementsByTagName("message");
for(int j=0;j<nl.getLength();j++)
{
String str=nl.item(j).getFirstChild().getNodue();
%>
<%=str %><br>
<%} %>
</body>
</html>
在瀏覽器中成功輸出:
電影:七劍 主演:甄子丹
電影:神話 主演:成龍
電影:世界大戰 主演:湯姆克魯斯
電影:喜馬拉雅星 主演:吳鎮宇
2:SAX實例
示例XML文件:file.xml
<?xml version="1.0" encoding="gb2312"?>
<common city="jinan" date="11/06/2009">
<file name="英雄" price="120" station="影院1" time="19:00"
description="大片">
</file>
<file name="無間道" price="100" station="影院2" time="18:30"
description="香港">
</file>
<file name="阿甘正傳" price="200" station="影院3" time="20:00"
description="好萊塢大片">
</file>
</common>
.java源文件:
package xml;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
public class XMLReader extends DefaultHandler{
private int index;
private Locator locator;
public XMLReader()
{
super();
}
public static void main(String[]args)
{
try
{
SAXParserFactory sf=SAXParserFactory.newInstance();//產生新的SAX流的工廠實例
SAXParser sp=sf.newSAXParser();//用工廠生產出SAX流的實例
XMLReader reader=new XMLReader();
sp.parse(new InputSource("f:/file.xml"), reader);//把目標文件轉化爲輸入流
}
catch (Exception e) {
e.printStackTrace();
}
}
//處理文檔解析開始事件
public void startDocument()
{
System.out.println("/n***********************(--電影放映安排 --)*******************/n");
}
//處理元素開始事件
public void startElement(String uri,String localName,String qName,Attributes attrs)
{
if(qName.equalsIgnoreCase("file"))
{
index++;
int attrCount=attrs.getLength();
for(int i=0;i<attrCount;i++)
{
String attrName=attrs.getQName(i);
if(attrName.equalsIgnoreCase("name"))
{
System.out.println("/t第"+index+"場,片名<<"+attrs.getValue(i)+">>");
}
if(attrName.equalsIgnoreCase("price"))
{
System.out.println("/t票價:"+attrs.getValue(i));
}
if(attrName.equalsIgnoreCase("station"))
{
System.out.println("/t放映地點:"+attrs.getValue(i));
}
if(attrName.equalsIgnoreCase("time"))
{
System.out.println("/t放映時間"+attrs.getValue(i));
}
if(attrName.equalsIgnoreCase("description"))
{
System.out.println("/t影片簡介"+attrs.getValue(i));
}
System.out.println();
}
}
}
//處理文檔解析結束事件
public void endDocument() throws SAXException {
System.out.println("/t/t/t/t/t/t/t-----共有"+index+"場電影");
}
//處理元素結束事件
public void endElement(String uri, String localName, String name){
}
//打印致命錯誤信息
public void fatalError(SAXParseException e) throws SAXException {
super.fatalError(e);
}
//打印普通錯誤
public void error(SAXParseException e) throws SAXException {
super.error(e);
}
//打印警告信息
public void warning(SAXParseException e) throws SAXException {
super.warning(e);
}
}
成功調試,輸出結果:
***********************(--電影放映安排--)************************
第1場,片名<<英雄>>
票價:120
放映地點:影院1
放映時間19:00
影片簡介大片
第2場,片名<<無間道>>
票價:100
放映地點:影院2
放映時間18:30
影片簡介香港
第3場,片名<<阿甘正傳>>
票價:200
放映地點:影院3
放映時間20:00
影片簡介好萊塢大片
-----共有3場電影
3:JDOM實例
XML示例文件:city.xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book email="[email protected]">
<name>jinan</name>
</book>
<book email="[email protected]">
<name>jinan</name>
</book>
<book email="[email protected]">
<name>jinan</name>
</book>
</books>
.java源文件:
package xml;
import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
public class JDomXml {
public JDomXml()
{
String xmlpath="f:/city.xml";
SAXBuilder builder=new SAXBuilder();
try
{
Document doc=builder.build(xmlpath);
Element books=doc.getRootElement();
List booklist=books.getChildren("book");
for(Iterator iter=booklist.iterator();iter.hasNext();)
{
Element book=(Element)iter.next();
String email=book.getAttributue("email");
String name=book.getChildTextTrim("name");
System.out.println(email);
System.out.println(name);
book.getChild("name").setText("shandong");
}
XMLOutputter outputter=new XMLOutputter();
outputter.output(doc, new FileOutputStream(xmlpath));
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args)
{
new JDomXml();
}
}
調試成功,輸出結果:[email protected]
jinan
[email protected]
jinan
[email protected]
jinan
並把文件中的jinan全部改成了shandong
4:Dom4j實例
XML示例文件:book.xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book show="yes">
</book>
<book show="yes">
<title>jsp</title>
</book>
<book show="no">
<title>java</title>
</book>
<owner>guangxu</owner>
</books>
.java源文件
import java.io.File;
import java.io.FileWriter;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4j {
public boolean Dom4j() {
try{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File("f:/book.xml"));
List list = document.selectNodes("/books/book/@show" ); //用xpath查找對象
Iterator iter = list.iterator();
while(iter.hasNext())
{
Attribute attribute = (Attribute)iter.next();
if(attribute.getValue().equals("yes"))
{
attribute.setValue("no");
}
}//如果book節點中show屬性的內容爲yes,則修改成no
list = document.selectNodes("/books/owner" );
iter = list.iterator();
if(iter.hasNext())
{
Element ownerElement = (Element)iter.next();
ownerElement.setText("Tshinghua");//把owner項內容改爲guangxu123
Element dateElement = ownerElement.addElement("date");
dateElement.setText("2004-09-11");
dateElement.addAttribute("type","computer");
}
list = document.selectNodes("/books/book");
iter = list.iterator();
while(iter.hasNext())
{
Element bookElement = (Element)iter.next();
Iterator iterator = bookElement.elementIterator("title");
while(iterator.hasNext())
{
Element titleElement=(Element)iterator.next();
if(titleElement.getText().equals("jsp"))//若title內容爲jsp,則刪除該節點
{
bookElement.remove(titleElement);
}
}
}
XMLWriter writer = new XMLWriter(new FileWriter(new File("f:/book.xml")));
writer.write(document);
writer.close();
}
catch(Exception ex){
ex.printStackTrace();
}
return true;
}
public static void main(String[]args)
{
new Dom4j();
}
}
JAVA操作XML的四種歸類
一: DOM(JAXP Crimson解析器)
DOM是用與平臺和語言無關的方式表示XML文檔的官方W3C標準。DOM是以層次結構組織的節點或信息片斷的集合。這個層次結構允許開發人員在樹中尋找特定信息。分析該結構通常需要加載整個文檔和構造層次結構,然後才能做任何工作。由於它是基於信息層次的,因而DOM被認爲是基於樹或基於對象的。DOM 以及廣義的基於樹的處理具有幾個優點。首先,由於樹在內存中是持久的,因此可以修改它以便應用程序能對數據和結構作出更改。它還可以在任何時候在樹中上下導航,而不是像SAX那樣是一次性的處理。DOM使用起來也要簡單得多。
二:SAX
SAX處理的優點非常類似於流媒體的優點。分析能夠立即開始,而不是等待所有的數據被處理。而且,由於應用程序只是在讀取數據時檢查數據,因此不需要將數據存儲在內存中。這對於大型文檔來說是個巨大的優點。事實上,應用程序甚至不必解析整個文檔;它可以在某個條件得到滿足時停止解析。一般來說,SAX還比它的替代者DOM快許多。
選擇DOM還是選擇SAX? 對於需要自己編寫代碼來處理XML文檔的開發人員來說, 選擇DOM還是SAX解析模型是一個非常重要的設計決策。 DOM採用建立樹形結構的方式訪問XML文檔,而SAX採用的事件模型。
DOM解析器把XML文檔轉化爲一個包含其內容的樹,並可以對樹進行遍歷。用DOM解析模型的優點是編程容易,開發人員只需要調用建樹的指令,然後利用 navigation APIs訪問所需的樹節點來完成任務。可以很容易的添加和修改樹中的元素。然而由於使用DOM解析器的時候需要處理整個XML文檔,所以對性能和內存的要求比較高,尤其是遇到很大的XML文件的時候。由於它的遍歷能力,DOM解析器常用於XML文檔需要頻繁的改變的服務中。
SAX解析器採用了基於事件的模型,它在解析XML文檔的時候可以觸發一系列的事件,當發現給定的tag的時候,它可以激活一個回調方法,告訴該方法制定的標籤已經找到。SAX對內存的要求通常會比較低,因爲它讓開發人員自己來決定所要處理的tag.特別是當開發人員只需要處理文檔中所包含的部分數據時,SAX這種擴展能力得到了更好的體現。但用SAX解析器的時候編碼工作會比較困難,而且很難同時訪問同一個文檔中的多處不同數據。
三 : JDOM
JDOM的目的是成爲Java特定文檔模型,它簡化與XML的交互並且比使用DOM實現更快。由於是第一個Java特定模型,JDOM一直得到大力推廣和促進。正在考慮通過“Java規範請求JSR-102”將它最終用作“Java標準擴展”。從2000年初就已經開始了JDOM開發。
JDOM與DOM主要有兩方面不同。首先,JDOM僅使用具體類而不使用接口。這在某些方面簡化了API,但是也限制了靈活性。第二,API大量使用了 Collections類,簡化了那些已經熟悉這些類的Java開發者的使用。
JDOM文檔聲明其目的是“使用20%(或更少)的精力解決80%(或更多)Java/XML問題”(根據學習曲線假定爲20%)。JDOM對於大多數 Java/XML應用程序來說當然是有用的,並且大多數開發者發現API比DOM容易理解得多。JDOM還包括對程序行爲的相當廣泛檢查以防止用戶做任何在XML中無意義的事。然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情況下的錯誤)。這也許是比學習DOM或JDOM接口都更有意義的工作。
JDOM自身不包含解析器。它通常使用SAX2解析器來解析和驗證輸入XML文檔(儘管它還可以將以前構造的DOM表示作爲輸入)。它包含一些轉換器以將 JDOM表示輸出成SAX2事件流、DOM模型或XML文本文檔。JDOM是在Apache許可證變體下發布的開放源碼。
四: DOM4J
雖然DOM4J代表了完全獨立的開發結果,但最初,它是JDOM的一種智能分支。它合併了許多超出基本XML文檔表示的功能,包括集成的XPath支持、 XML Schema支持以及用於大文檔或流化文檔的基於事件的處理。它還提供了構建文檔表示的選項,它通過DOM4J API和標準DOM接口具有並行訪問功能。從2000下半年開始,它就一直處於開發之中。
爲支持所有這些功能,DOM4J使用接口和抽象基本類方法。DOM4J大量使用了API中的Collections類,但是在許多情況下,它還提供一些替代方法以允許更好的性能或更直接的編碼方法。直接好處是,雖然DOM4J付出了更復雜的API的代價,但是它提供了比JDOM大得多的靈活性。
在添加靈活性、XPath集成和對大文檔處理的目標時,DOM4J的目標與JDOM是一樣的:針對Java開發者的易用性和直觀操作。它還致力於成爲比 JDOM更完整的解決方案,實現在本質上處理所有Java/XML問題的目標。在完成該目標時,它比JDOM更少強調防止不正確的應用程序行爲。
DOM4J是一個非常非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件。如今你可以看到越來越多的Java軟件都在使用DOM4J來讀寫 XML,特別值得一提的是連Sun的JAXM也在用DOM4J.
使用Java操作XML
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.