JAXP解析XML
1準備解析的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語言編程接口。
?//JAXP支持DOM、XSLT、SAX等標準?
?
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的靜態方法newInstance創建了一個DocumentBuilderFactory實例,然后調用
??????newDocumentBuilder()方法創建一個DocumentBuilder對象
???????用DocumentBuilder的parse()方法就可以來解析xml文檔并建立Dom模型。
????????
??????DocumentBuilderFactory?factory?=?DocumentBuilderFactory.newInstance();?創建一個xml解析器
??????Document接口描述了對應于整個xml文檔的對應樹,提供對文檔的訪問。
????????
??????DOM標準模型中并沒有定義輸出的接口,因而如果需要進行文檔輸出的話,
???????就需要用到JAXP的擴展,使用到XmlDocument。這兒有一個較為簡便的方法,
???????就是用強制類型轉換,把一個Document類轉換成XmlDocument,然后,就可以使用XmlDocument的write()方法了
??????XmlDocument?xdoc?=?(XmlDocument)?document;?
??????xdoc.write?(System.out);
????*/
????????//獲取一個xml解析器
????????factory=DocumentBuilderFactory.newInstance();
????????try?{
????????????//解析XML文件生成DOM文檔的接口類,以便訪問DOM
????????????parser=factory.newDocumentBuilder();
????????????document=parser.parse("parseXML.xml");
????????????Element?element?=?document.getDocumentElement();
????????????System.out.println(element);
????????????NodeList?list=element.getChildNodes();
????????????GetElement(list);//解析子節點
????????????createNode();//向dom中插入節點,并寫入xml中
????????}?catch?(ParserConfigurationException?e)?{
????????????e.printStackTrace();
????????}
????????//獲得將DOM文檔轉化為xml的轉換器
????????transformerFactory=TransformerFactory.newInstance();
????????//下面調用JAXP的XSTL引擎來實現DOM樹中的數據到xml文件的功能,XSTL的引擎輸入為DOMSource對象,輸出為StreamResult對象。
????????try?{
????????????//Transform相當于一個XSTL引擎,通常我們用它的處理XSL文件,
????????????//這里我們用它來輸出xml文件
????????????transform=transformerFactory.newTransformer();
????????????//創建一個DOMSource對象,參數為Document對象,該對象表現為轉化成別的表達形式的信息容器。
????????????domSource=new?DOMSource(document);
????????????//創建一個File對象,代表DOM?Tree所包含的數據的輸出介質,這是一個XML文件
????????????//創建一個StreamResult對象,該對象是將DOM對象文檔轉換為其他文檔的容器,可以是一個xml文件,txt文件。
????????????streamResult=new?StreamResult(new?File("test.xml"));
????????????//調用transform將DOM文件轉換為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類型對象
????????????????System.out.println(node.getNodeName());
????????????????GetElement(node.getChildNodes());
????????????}
????????????else?if(node.getNodeType()==3){//Text類型對象
????????????????str=node.getNodeValue();
????????????????if(str.length()>0){
????????????????????System.out.println(str);
????????????????????
????????????????}
????????????}
????????}
????}
}
???最近在學習ajax,在服務器解析xml文件,所以開始學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語言編程接口。
?//JAXP支持DOM、XSLT、SAX等標準?
?
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的靜態方法newInstance創建了一個DocumentBuilderFactory實例,然后調用
??????newDocumentBuilder()方法創建一個DocumentBuilder對象
???????用DocumentBuilder的parse()方法就可以來解析xml文檔并建立Dom模型。
????????
??????DocumentBuilderFactory?factory?=?DocumentBuilderFactory.newInstance();?創建一個xml解析器
??????Document接口描述了對應于整個xml文檔的對應樹,提供對文檔的訪問。
????????
??????DOM標準模型中并沒有定義輸出的接口,因而如果需要進行文檔輸出的話,
???????就需要用到JAXP的擴展,使用到XmlDocument。這兒有一個較為簡便的方法,
???????就是用強制類型轉換,把一個Document類轉換成XmlDocument,然后,就可以使用XmlDocument的write()方法了
??????XmlDocument?xdoc?=?(XmlDocument)?document;?
??????xdoc.write?(System.out);
????*/
????????//獲取一個xml解析器
????????factory=DocumentBuilderFactory.newInstance();
????????try?{
????????????//解析XML文件生成DOM文檔的接口類,以便訪問DOM
????????????parser=factory.newDocumentBuilder();
????????????document=parser.parse("parseXML.xml");
????????????Element?element?=?document.getDocumentElement();
????????????System.out.println(element);
????????????NodeList?list=element.getChildNodes();
????????????GetElement(list);//解析子節點
????????????createNode();//向dom中插入節點,并寫入xml中
????????}?catch?(ParserConfigurationException?e)?{
????????????e.printStackTrace();
????????}
????????//獲得將DOM文檔轉化為xml的轉換器
????????transformerFactory=TransformerFactory.newInstance();
????????//下面調用JAXP的XSTL引擎來實現DOM樹中的數據到xml文件的功能,XSTL的引擎輸入為DOMSource對象,輸出為StreamResult對象。
????????try?{
????????????//Transform相當于一個XSTL引擎,通常我們用它的處理XSL文件,
????????????//這里我們用它來輸出xml文件
????????????transform=transformerFactory.newTransformer();
????????????//創建一個DOMSource對象,參數為Document對象,該對象表現為轉化成別的表達形式的信息容器。
????????????domSource=new?DOMSource(document);
????????????//創建一個File對象,代表DOM?Tree所包含的數據的輸出介質,這是一個XML文件
????????????//創建一個StreamResult對象,該對象是將DOM對象文檔轉換為其他文檔的容器,可以是一個xml文件,txt文件。
????????????streamResult=new?StreamResult(new?File("test.xml"));
????????????//調用transform將DOM文件轉換為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類型對象
????????????????System.out.println(node.getNodeName());
????????????????GetElement(node.getChildNodes());
????????????}
????????????else?if(node.getNodeType()==3){//Text類型對象
????????????????str=node.getNodeValue();
????????????????if(str.length()>0){
????????????????????System.out.println(str);
????????????????????
????????????????}
????????????}
????????}
????}
}