Java與XML(一)基礎
JAXP API--嵌入不同的解釋器
SAX解釋器+DOM解釋器+XSL轉換器
javax.xml.parsers中加載XML文檔的類:
DocumentBuilder
DocumentBuildrFactory
SAXParser
SAXParserFactory
=====================================
SAX API
SAX的XML解釋器:Apache的Xerces或Crimson
處理XML文檔的接口:
ContentHandler
EntityResolver
ErroHandler
DTDHandler
DeclHandler
LexicalHandler
======================================
DOM API
兩個DOM標準:DOM Level1 DOM Level 2 Core
節點
Node-節點類型接口層次結構的根。
Document-樹結構的根
Element-XML元素
Text-元素內的文本
Attr-元素的特性
CDATA Sectionn-CDATA
NodeList-子節點的集合
ProcessingInstruction-指令
Comment-包含注釋的信息
DocumentFragment-Document的消減版,用于在樹中移動節點
DocumentType-文檔類型定義的子集。
Entity-DTD中的實體標記
EntityReference-XML文檔中的實體引用
Notation-DTD中的符號標記
從程序中讀取X M L文檔基本上有三種方式:
1把X M L只當做一個文件讀取,然后自己挑選出其中的標簽。這是黑客們的方法,我們不推薦這種方式。
你很快會發現處理所有的特殊情況(包括不同的字符編碼,例外約定,內部和外部實體,缺省屬性等)比想象的困難得多;
你可能不能夠正確地處理所有的特殊情況,這樣你的程序會接收到一個非常規范的X M L文檔,卻不能正確地處理它。
要避免這種想法:XML解析器似乎并不昂貴(大多數是免費的)。
2可以用解析器分析文檔并在內存里創建對文檔內容樹狀的表達方式:解析器將輸出傳遞給文檔對象模型,即DOM。
這樣程序可以從樹的頂部開始遍歷,按照從一個樹單元到另一個單元的引用,從而找到需要的信息。
3也可以用解析器讀取文檔,當解析器發現標簽時告知程序它發現的標簽。
例如它會告知它何時發現了一個開始標簽,何時發現了一些特征數據,以及何時發現了一個結束標簽。
這叫做事件驅動接口,因為解析器告知應用程序它遇到的有含義的事件。
如果這正是你需要的那種接口,可以使用SAX。
SAX是只讀的
DOM可以從XML原文件中讀取文檔,也可以創建和修改內存中的文檔。相比較而言,SAX是用來讀取XML文檔而不是書寫文檔。
可擴展樣式語言(XSL,eXtensible Sytlesheet Language)是一種基于XML的語言,
它被設計用來轉換XML文檔到另一種XML文檔或轉換XML文檔為可翻譯對象。
原始的XSL語言已經被分割成三種不同的語言:
1轉換工具(XSLT)是一種轉換XML文檔到其他XML文檔的語言
2翻譯工具(XSLF—可以包括X S LT的使用)
3XML分級命令處理工具(XPath)
XSL有它自已的根,不管是在層疊樣式表(CSS)中還是在一種叫DSSSL(文檔樣式語義和規格語言—讀為'deessel')的語言中。
隨著它的發展,XSL的樣式表現變得更接近于CSS和遠離DSSSL
================================================================================
Java與XML(二)用java編寫xml的讀寫程序
這是讀取xml文件的java程序,我調試好的。采用的是dom方式讀取xml文件到Vector中。
package src;
import java.io.*;
import java.util.Vector;
import javax.xml.parsers.*;
import org.w3c.dom.*;
public class readxml {
static Document document;
private boolean validating;
public readxml() {
}
public Vector toRead(String filename) {
Vector title=new Vector();
Vector content=new Vector();
String myStr=new String();
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(validating);
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(new File(filename));
document.getDocumentElement().normalize();
Node node = document.getFirstChild();
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node nodeitm = list.item(i);
if (nodeitm.getNodeName().equals("Title")) {
myStr=nodeitm.getFirstChild().getNodeValue();
title.addElement(myStr);//getFirstChild()
}
if (nodeitm.getNodeName().equals("Content")) {
myStr=nodeitm.getFirstChild().getNodeValue();
content.addElement(myStr);
}
}
} catch (Exception exp) {
exp.printStackTrace();
return null;
}
Vector all=new Vector();
all.add(title);
all.add(content);
return all;
}
public static void main(String[] args) {
Vector A;
readxml my = new readxml();
A = my.toRead("f:\\tomcat5\\webapps\\myxml\\xmldata\\9.xml");
for (int i = 0; i < A.size(); i++) {
System.out.println(A.elementAt(i));
}
}
}
這是將xml寫入文件。其中,transformer.setOutputProperty(OutputKeys.ENCODING,"GB2312")關系到編碼問題,非常重要。
import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
public class writexml {
private Document document;
private String filename;
public writexml(String name) throws ParserConfigurationException{
filename=name;
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
document=builder.newDocument();
}
public void toWrite(String mytitle,String mycontent){
Element root=document.createElement("WorkShop");
document.appendChild(root);
Element title=document.createElement("Title");
title.appendChild(document.createTextNode(mytitle));
root.appendChild(title);
Element content=document.createElement("Content");
content.appendChild(document.createTextNode(mycontent));
root.appendChild(content);
}
public void toSave(){
try{
TransformerFactory tf=TransformerFactory.newInstance();
Transformer transformer=tf.newTransformer();
DOMSource source=new DOMSource(document);
transformer.setOutputProperty(OutputKeys.ENCODING,"GB2312");
transformer.setOutputProperty(OutputKeys.INDENT,"yes");
PrintWriter pw=new PrintWriter(new FileOutputStream(filename));
StreamResult result=new StreamResult(pw);
transformer.transform(source,result);
}
catch(TransformerException mye){
mye.printStackTrace();
}
catch(IOException exp){
exp.printStackTrace();
}
}
public static void main(String args[]){
try{
writexml myxml=new writexml("f:\\tomcat5\\webapps\\myxml\\xmldata\\9.xml");
myxml.toWrite("中文題目","中文內容");
myxml.toSave();
System.out.print("Your writing is successful.");
}
catch(ParserConfigurationException exp){
exp.printStackTrace();
System.out.print("Your writing is failed.");
}
}
}
=================================================================================
利用(二)中我寫的兩個函數(放在package src中),這次實現web頁面的操作。
index.html:
<%@ page language="java" pageEncoding="GB2312"%>
<body>
<p> </p>
<p> </p>
<p> </p>
<table width="60%" border="1" align="center">
<tr>
<td>
<p align="left"><font size="4" color="#003399">管理測試程序</font></p>
<form name="readform" method=post action="load.jsp">
<p align="left"><font color="#FF0000">讀取xml文件: </font></p>
<p align="left"> <font color="#FF0000">
<input type="text" name="mypath" size="50" value="c:\\eclipse\\workspace\\myxml\\xmldata\\1.xml">
</font></p>
<p align="left">
<a href="#" onClick=submit()>讀取</a>
</p>
<p align="left"> </p>
</form>
<form name="writeform" method=post action="create.jsp">
<p align="left"><font color="#FF0000">寫入xml文件:</font> </p>
<p align="left">請填寫路徑:
<input type="text" name="mypath" width="100" size="50"
value="c:\\eclipse\\workspace\\myxml\\xmldata\\11.xml">
</p>
<p align="left">請填寫題目:
<input type="text" name="mytitle" width="100" size="50">
</p>
<p align="left">請填寫內容:
<textarea name="mycontent" cols="100"></textarea>
</p>
<p align="left">
<a href="#" onClick=submit()>寫入</a>
</p>
</form>
</td>
</tr>
</table>
</body>
寫入的頁面create.jsp:
<%@ page language="java" pageEncoding="GB2312"%>
<%@ page import="src.*" %>
<%@ page import="org.w3c.dom.*"%>
<%@ page import="javax.xml.parsers.*"%>
<%@ page import="javax.xml.transform.*"%>
<%@ page import="javax.xml.transform.dom.DOMSource"%>
<%@ page import="javax.xml.transform.stream.StreamResult"%>
<%@ page import="java.io.*"%>
<html>
<body>
<%
String mypath=(String)request.getParameter("mypath");
String mytitle=(String)request.getParameter("mytitle");
String mycontent=(String)request.getParameter("mycontent");
mypath=new String(mypath.getBytes("ISO-8859-1"),"GB2312");
mytitle=new String(mytitle.getBytes("ISO-8859-1"),"GB2312");
mycontent=new String(mycontent.getBytes("ISO-8859-1"),"GB2312");
try{
writexml myxml=new writexml(mypath);
myxml.toWrite(mytitle,mycontent);
myxml.toSave();
out.print("Your writing is successful.");
}
catch(ParserConfigurationException exp){
exp.printStackTrace();
out.print("Your writing is failed.");
}
%>
</body>
</html>
讀取xml的頁面load.jsp:
<%@ page language="java" pageEncoding="GB2312"%>
<%@ page import="src.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.Vector" %>
<%@ page import="javax.xml.parsers.*" %>
<%@ page import="org.w3c.dom.*" %>
<html>
<body>
<%
Vector A=new Vector();
String mypath=(String)request.getParameter("mypath");
out.println(mypath);%>
<p>
<%
readxml my = new readxml();
A = my.toRead(mypath);
for (int i = 0; i < A.size(); i++) {
out.println(A.elementAt(i));
%>
<p>
<%
}
%>
</body>
</html>
這個寫程序還有一個缺陷,它只是創建xml格式和內容,而不是改寫已有文件。
如果您寫出了改寫文件的程序望能交流。
posted on 2005-02-15 11:28 辰 閱讀(244) 評論(0) 編輯 收藏 所屬分類: Java_Xml