JAXP解析XML
1準(zhǔn)備解析的xml文件??????parseXML.xml
??????























??????DomToXml.java
??????
package?dom.test;
import?java.io.*;
import?javax.xml.parsers.DocumentBuilder;
import?javax.xml.parsers.DocumentBuilderFactory;
import?javax.xml.parsers.ParserConfigurationException;
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;
import?org.w3c.dom.Node;
import?org.w3c.dom.NodeList;
import?org.w3c.dom.Text;
import?org.xml.sax.SAXException;
/**
?*?@author?windfree
?*
?*/
?//JAXP是java?API?for?XML?processing,幾用于處理xml文檔的java語(yǔ)言編程接口。
?//JAXP支持DOM、XSLT、SAX等標(biāo)準(zhǔn)?
?
public?class?DomToXml?{
????public?static?DocumentBuilderFactory?factory;
????public?static?DocumentBuilder?parser;
????public?static?Document?document;
????public?static?TransformerFactory?transformerFactory;
????public?static?Transformer?transform;
????public?static?DOMSource?domSource;
????public?static?StreamResult?streamResult;
????public?static?void?main(String[]?args)?{
????????try?{
????????????test();
????????}?catch?(SAXException?e)?{
????????????//?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????}?catch?(IOException?e)?{
????????????//?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????}
????}
????private?static?void?createNode()?{
????????Element?root=document.getDocumentElement();
????????Element?firstNode=document.createElement("other");
????????root.appendChild(firstNode);
????????Text?text=document.createTextNode("test");
????????Element?nextNode=document.createElement("state");
????????nextNode.appendChild(text);
????????firstNode.appendChild(nextNode);
????????
????????
????}
????public?static?void?test()?throws?SAXException,?IOException{
????/*DocumentBuilderFactory的靜態(tài)方法newInstance創(chuàng)建了一個(gè)DocumentBuilderFactory實(shí)例,然后調(diào)用
??????newDocumentBuilder()方法創(chuàng)建一個(gè)DocumentBuilder對(duì)象
???????用DocumentBuilder的parse()方法就可以來(lái)解析xml文檔并建立Dom模型。
????????
??????DocumentBuilderFactory?factory?=?DocumentBuilderFactory.newInstance();?創(chuàng)建一個(gè)xml解析器
??????Document接口描述了對(duì)應(yīng)于整個(gè)xml文檔的對(duì)應(yīng)樹(shù),提供對(duì)文檔的訪問(wèn)。
????????
??????DOM標(biāo)準(zhǔn)模型中并沒(méi)有定義輸出的接口,因而如果需要進(jìn)行文檔輸出的話,
???????就需要用到JAXP的擴(kuò)展,使用到XmlDocument。這兒有一個(gè)較為簡(jiǎn)便的方法,
???????就是用強(qiáng)制類(lèi)型轉(zhuǎn)換,把一個(gè)Document類(lèi)轉(zhuǎn)換成XmlDocument,然后,就可以使用XmlDocument的write()方法了
??????XmlDocument?xdoc?=?(XmlDocument)?document;?
??????xdoc.write?(System.out);
????*/
????????//獲取一個(gè)xml解析器
????????factory=DocumentBuilderFactory.newInstance();
????????try?{
????????????//解析XML文件生成DOM文檔的接口類(lèi),以便訪問(wèn)DOM
????????????parser=factory.newDocumentBuilder();
????????????document=parser.parse("parseXML.xml");
????????????Element?element?=?document.getDocumentElement();
????????????System.out.println(element);
????????????NodeList?list=element.getChildNodes();
????????????GetElement(list);//解析子節(jié)點(diǎn)
????????????createNode();//向dom中插入節(jié)點(diǎn),并寫(xiě)入xml中
????????}?catch?(ParserConfigurationException?e)?{
????????????e.printStackTrace();
????????}
????????//獲得將DOM文檔轉(zhuǎn)化為xml的轉(zhuǎn)換器
????????transformerFactory=TransformerFactory.newInstance();
????????//下面調(diào)用JAXP的XSTL引擎來(lái)實(shí)現(xiàn)DOM樹(shù)中的數(shù)據(jù)到xml文件的功能,XSTL的引擎輸入為DOMSource對(duì)象,輸出為StreamResult對(duì)象。
????????try?{
????????????//Transform相當(dāng)于一個(gè)XSTL引擎,通常我們用它的處理XSL文件,
????????????//這里我們用它來(lái)輸出xml文件
????????????transform=transformerFactory.newTransformer();
????????????//創(chuàng)建一個(gè)DOMSource對(duì)象,參數(shù)為Document對(duì)象,該對(duì)象表現(xiàn)為轉(zhuǎn)化成別的表達(dá)形式的信息容器。
????????????domSource=new?DOMSource(document);
????????????//創(chuàng)建一個(gè)File對(duì)象,代表DOM?Tree所包含的數(shù)據(jù)的輸出介質(zhì),這是一個(gè)XML文件
????????????//創(chuàng)建一個(gè)StreamResult對(duì)象,該對(duì)象是將DOM對(duì)象文檔轉(zhuǎn)換為其他文檔的容器,可以是一個(gè)xml文件,txt文件。
????????????streamResult=new?StreamResult(new?File("test.xml"));
????????????//調(diào)用transform將DOM文件轉(zhuǎn)換為xml文件
????????????transform.transform(domSource,?streamResult);
????????????
????????}?catch?(TransformerConfigurationException?e)?{
????????????
????????????e.printStackTrace();
????????}?catch?(TransformerException?e)?{
????????????//?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????}
????????
????}
????private?static?void?GetElement(NodeList?list)?{
????????Node?node;
????????int?i;
????????String?str;
????????if(list.getLength()==0){
????????????return;
????????}
????????for(i=0;i<list.getLength();i++){
????????????
????????????node?=list.item(i);
????????????if(node.getNodeType()==1){//Node類(lèi)型對(duì)象
????????????????System.out.println(node.getNodeName());
????????????????GetElement(node.getChildNodes());
????????????}
????????????else?if(node.getNodeType()==3){//Text類(lèi)型對(duì)象
????????????????str=node.getNodeValue();
????????????????if(str.length()>0){
????????????????????System.out.println(str);
????????????????????
????????????????}
????????????}
????????}
????}
}
???最近在學(xué)習(xí)ajax,在服務(wù)器解析xml文件,所以開(kāi)始學(xué)JAXP和digester.
import?java.io.*;
import?javax.xml.parsers.DocumentBuilder;
import?javax.xml.parsers.DocumentBuilderFactory;
import?javax.xml.parsers.ParserConfigurationException;
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;
import?org.w3c.dom.Node;
import?org.w3c.dom.NodeList;
import?org.w3c.dom.Text;
import?org.xml.sax.SAXException;
/**
?*?@author?windfree
?*
?*/
?//JAXP是java?API?for?XML?processing,幾用于處理xml文檔的java語(yǔ)言編程接口。
?//JAXP支持DOM、XSLT、SAX等標(biāo)準(zhǔn)?
?
public?class?DomToXml?{
????public?static?DocumentBuilderFactory?factory;
????public?static?DocumentBuilder?parser;
????public?static?Document?document;
????public?static?TransformerFactory?transformerFactory;
????public?static?Transformer?transform;
????public?static?DOMSource?domSource;
????public?static?StreamResult?streamResult;
????public?static?void?main(String[]?args)?{
????????try?{
????????????test();
????????}?catch?(SAXException?e)?{
????????????//?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????}?catch?(IOException?e)?{
????????????//?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????}
????}
????private?static?void?createNode()?{
????????Element?root=document.getDocumentElement();
????????Element?firstNode=document.createElement("other");
????????root.appendChild(firstNode);
????????Text?text=document.createTextNode("test");
????????Element?nextNode=document.createElement("state");
????????nextNode.appendChild(text);
????????firstNode.appendChild(nextNode);
????????
????????
????}
????public?static?void?test()?throws?SAXException,?IOException{
????/*DocumentBuilderFactory的靜態(tài)方法newInstance創(chuàng)建了一個(gè)DocumentBuilderFactory實(shí)例,然后調(diào)用
??????newDocumentBuilder()方法創(chuàng)建一個(gè)DocumentBuilder對(duì)象
???????用DocumentBuilder的parse()方法就可以來(lái)解析xml文檔并建立Dom模型。
????????
??????DocumentBuilderFactory?factory?=?DocumentBuilderFactory.newInstance();?創(chuàng)建一個(gè)xml解析器
??????Document接口描述了對(duì)應(yīng)于整個(gè)xml文檔的對(duì)應(yīng)樹(shù),提供對(duì)文檔的訪問(wèn)。
????????
??????DOM標(biāo)準(zhǔn)模型中并沒(méi)有定義輸出的接口,因而如果需要進(jìn)行文檔輸出的話,
???????就需要用到JAXP的擴(kuò)展,使用到XmlDocument。這兒有一個(gè)較為簡(jiǎn)便的方法,
???????就是用強(qiáng)制類(lèi)型轉(zhuǎn)換,把一個(gè)Document類(lèi)轉(zhuǎn)換成XmlDocument,然后,就可以使用XmlDocument的write()方法了
??????XmlDocument?xdoc?=?(XmlDocument)?document;?
??????xdoc.write?(System.out);
????*/
????????//獲取一個(gè)xml解析器
????????factory=DocumentBuilderFactory.newInstance();
????????try?{
????????????//解析XML文件生成DOM文檔的接口類(lèi),以便訪問(wèn)DOM
????????????parser=factory.newDocumentBuilder();
????????????document=parser.parse("parseXML.xml");
????????????Element?element?=?document.getDocumentElement();
????????????System.out.println(element);
????????????NodeList?list=element.getChildNodes();
????????????GetElement(list);//解析子節(jié)點(diǎn)
????????????createNode();//向dom中插入節(jié)點(diǎn),并寫(xiě)入xml中
????????}?catch?(ParserConfigurationException?e)?{
????????????e.printStackTrace();
????????}
????????//獲得將DOM文檔轉(zhuǎn)化為xml的轉(zhuǎn)換器
????????transformerFactory=TransformerFactory.newInstance();
????????//下面調(diào)用JAXP的XSTL引擎來(lái)實(shí)現(xiàn)DOM樹(shù)中的數(shù)據(jù)到xml文件的功能,XSTL的引擎輸入為DOMSource對(duì)象,輸出為StreamResult對(duì)象。
????????try?{
????????????//Transform相當(dāng)于一個(gè)XSTL引擎,通常我們用它的處理XSL文件,
????????????//這里我們用它來(lái)輸出xml文件
????????????transform=transformerFactory.newTransformer();
????????????//創(chuàng)建一個(gè)DOMSource對(duì)象,參數(shù)為Document對(duì)象,該對(duì)象表現(xiàn)為轉(zhuǎn)化成別的表達(dá)形式的信息容器。
????????????domSource=new?DOMSource(document);
????????????//創(chuàng)建一個(gè)File對(duì)象,代表DOM?Tree所包含的數(shù)據(jù)的輸出介質(zhì),這是一個(gè)XML文件
????????????//創(chuàng)建一個(gè)StreamResult對(duì)象,該對(duì)象是將DOM對(duì)象文檔轉(zhuǎn)換為其他文檔的容器,可以是一個(gè)xml文件,txt文件。
????????????streamResult=new?StreamResult(new?File("test.xml"));
????????????//調(diào)用transform將DOM文件轉(zhuǎn)換為xml文件
????????????transform.transform(domSource,?streamResult);
????????????
????????}?catch?(TransformerConfigurationException?e)?{
????????????
????????????e.printStackTrace();
????????}?catch?(TransformerException?e)?{
????????????//?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????}
????????
????}
????private?static?void?GetElement(NodeList?list)?{
????????Node?node;
????????int?i;
????????String?str;
????????if(list.getLength()==0){
????????????return;
????????}
????????for(i=0;i<list.getLength();i++){
????????????
????????????node?=list.item(i);
????????????if(node.getNodeType()==1){//Node類(lèi)型對(duì)象
????????????????System.out.println(node.getNodeName());
????????????????GetElement(node.getChildNodes());
????????????}
????????????else?if(node.getNodeType()==3){//Text類(lèi)型對(duì)象
????????????????str=node.getNodeValue();
????????????????if(str.length()>0){
????????????????????System.out.println(str);
????????????????????
????????????????}
????????????}
????????}
????}
}