java解析xml各種方法

XML現在已經成爲一種通用的數據交換格式,它的平臺無關性,語言無關性,系統無關性,給數據集成與交互帶來了極大的方便。

]對於XML本身的語法知識與技術細節,需要閱讀相關的技術文獻,這裏麪包括的內容有DOM(Document Object Model),DTD(Document Type Definition),

SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible Stylesheet Language Transformations),

具體可參閱w3c官方網站文檔http://www.w3.org獲取更多信息。

詳解Java解析XML的四種方法:

使用JAVA語言來實現DOM與SAX的XML文檔生成與解析。 
首先定義一個操作XML文檔的接口XmlDocument 它定義了XML文檔的建立與解析的接口。

/** 
* @author hongliang.dinghl 
* 定義XML文檔建立與解析的接口 
*/ 
public interface XmlDocument {
	/** 
	* 建立XML文檔 
	* @param fileName 文件全路徑名稱 
	*/ 
	public void createXml(String filename);
	
	/** 
	* 解析XML文檔 
	* @param fileName 文件全路徑名稱 
	*/ 
	public void parserXml(String filename);
	
}

1.DOM生成和解析XML文檔

爲 XML 文檔的已解析版本定義了一組接口。解析器讀入整個文檔,然後構建一個駐留內存的樹結構,然後代碼就可以使用 DOM 接口來操作這個樹結構。優點:整個文檔樹在內存中,便於操作;支持刪除、修改、重新排列等多種功能;缺點:將整個文檔調入內存(包括無用的節點),浪費時間和空間;使用場合:一旦解析了文檔還需多次訪問這些數據;硬件資源充足(內存、CPU)。 

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;

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;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * @author hongliang.dinghl DOM生成與解析XML文檔
 */
public class DomDemo implements XmlDocument {
	private Document document;
	private String filename;

	// 獲取xml的解析工廠
	public void init() {
		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			this.document = builder.newDocument();
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e.getMessage());
		}
	}

	// 創建
	@Override
	public void createXml(String filename) {
		// TODO Auto-generated method stub
		Element root = this.document.createElement("employees");
		this.document.appendChild(root);
		Element employee = this.document.createElement("employee");
		Element name = this.document.createElement("name");
		name.appendChild(this.document.createTextNode("丁宏亮"));
		employee.appendChild(name);
		Element sex = this.document.createElement("sex");
		sex.appendChild(this.document.createTextNode("m"));
		employee.appendChild(sex);
		Element age = this.document.createElement("age");
		age.appendChild(this.document.createTextNode("30"));
		employee.appendChild(age);
		root.appendChild(employee);
		TransformerFactory tf = TransformerFactory.newInstance();
		try {
			Transformer transformer = tf.newTransformer();
			DOMSource source = new DOMSource(document);
			transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			PrintWriter pw = new PrintWriter(new FileOutputStream(filename));
			StreamResult result = new StreamResult(pw);
			transformer.transform(source, result);
			System.out.println("生成XML文件成功!");
		} catch (TransformerConfigurationException e) {
			System.out.println(e.getMessage());
		} catch (IllegalArgumentException e) {
			System.out.println(e.getMessage());
		} catch (FileNotFoundException e) {
			System.out.println(e.getMessage());
		} catch (TransformerException e) {
			System.out.println(e.getMessage());
		}
	}

	// 解析
	@Override
	public void parserXml(String filename) {
		// TODO Auto-generated method stub
		try {
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = dbf.newDocumentBuilder();
			Document document = builder.parse(filename);
			NodeList employees = document.getChildNodes();
			for(int i=0;i<employees.getLength();i++){
				Node employee = employees.item(i);
				NodeList employeeinfo = employee.getChildNodes();
				for(int j=0;j<employeeinfo.getLength();j++){
					Node node = employeeinfo.item(j);
					NodeList employeeMeta = node.getChildNodes();
					for(int k=0;k<employeeMeta.getLength();k++){
						System.out.println(employeeMeta.item(k).getNodeName()+" : "+employeeMeta.item(k).getTextContent());
					}
				}
			}
			System.out.println("解析完畢"); 
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

2.SAX生成和解析XML文檔

爲解決DOM的問題,出現了SAX。SAX ,事件驅動。當解析器發現元素開始、元素結束、文本、文檔的開始或結束等時,發送事件,程序員編寫響應這些事件的代碼,保存數據。優點:不用事先調入整個文檔,佔用資源少;SAX解析器代碼比DOM解析器代碼小,適於Applet,下載。缺點:不是持久的;事件過後,若沒保存數據,那麼數據就丟了;無狀態性;從事件中只能得到文本,但不知該文本屬於哪個元素;使用場合:Applet;只需XML文檔的少量內容,很少回頭訪問;機器內存少;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**  
*   
* @author hongliang.dinghl  
* SAX文檔解析  
*/
public class SaxDemo implements XmlDocument {
	@Override
	public void createXml(String filename) {
		// TODO Auto-generated method stub
		System.out.println("<<"+filename+">>");   
	}
	@Override
	public void parserXml(String filename) {
		// TODO Auto-generated method stub
		try {
			SAXParserFactory spf = SAXParserFactory.newInstance();
			SAXParser parser = spf.newSAXParser();
			InputStream is = new FileInputStream(filename);
			parser.parse(is,new MySAXHandler());
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}
class MySAXHandler extends DefaultHandler{
	boolean hasAttribute = false;
	Attributes attributes = null;
	@Override
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.startDocument();
		System.out.println("文檔打印開始了"); 
	}
	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.endDocument();
		System.out.println("文檔打印結束了"); 
	}
	
	@Override
	public void startElement(String arg0, String arg1, String arg2,
			Attributes arg3) throws SAXException {
		// TODO Auto-generated method stub
		if(arg2.equals("employees")){
			return;
		}
		if(arg2.equals("employee")){
			System.out.println(arg2);
		}
		
		if (arg3.getLength() > 0) {  
			this.attributes = arg3;  
			this.hasAttribute = true;  
		}  

	}
	@Override
	public void endElement(String arg0, String arg1, String arg2)
			throws SAXException {
		// TODO Auto-generated method stub
		if (hasAttribute && (attributes != null)) {  
			for (int i = 0; i < attributes.getLength(); i++) {  
			System.out.println(attributes.getQName(0)+ attributes.getValue(0));  
			}  
		}
	}
	@Override
	public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
		// TODO Auto-generated method stub
		System.out.println(new String(arg0, arg1, arg2)); 
	}
}

3.DOM4J生成和解析XML文檔

DOM4J 是一個非常非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件。如今你可以看到越來越多的 Java 軟件都在使用 DOM4J 來讀寫 XML,特別值得一提的是連 Sun 的 JAXM 也在用 DOM4J。


import java.io.File;   
import java.io.FileWriter;   
import java.io.IOException;   
import java.io.Writer;   
import java.util.Iterator;   

import org.dom4j.Document;   
import org.dom4j.DocumentException;   
import org.dom4j.DocumentHelper;   
import org.dom4j.Element;   
import org.dom4j.io.SAXReader;   
import org.dom4j.io.XMLWriter;   
/**  
*   
* @author hongliang.dinghl  
* Dom4j 生成XML文檔與解析XML文檔  
*/  
public class Dom4jDemo implements XmlDocument {   

public void createXml(String fileName) {   
Document document = DocumentHelper.createDocument();   
Element employees=document.addElement("employees");   
Element employee=employees.addElement("employee");   
Element name= employee.addElement("name");   
name.setText("ddvip");   
Element sex=employee.addElement("sex");   
sex.setText("m");   
Element age=employee.addElement("age");   
age.setText("29");   
try {   
Writer fileWriter=new FileWriter(fileName);   
XMLWriter xmlWriter=new XMLWriter(fileWriter);   
xmlWriter.write(document);   
xmlWriter.close();   
} catch (IOException e) {   

System.out.println(e.getMessage());   
}   


}   


public void parserXml(String fileName) {   
File inputXml=new File(fileName);   
SAXReader saxReader = new SAXReader();   
try {   
Document document = saxReader.read(inputXml);   
Element employees=document.getRootElement();   
for(Iterator i = employees.elementIterator(); i.hasNext();){   
Element employee = (Element) i.next();   
for(Iterator j = employee.elementIterator(); j.hasNext();){   
Element node=(Element) j.next();   
System.out.println(node.getName()+":"+node.getText());   
}   

}   
} catch (DocumentException e) {   
System.out.println(e.getMessage());   
}   
System.out.println("dom4j parserXml");   
}   
}   

4.JDOM生成和解析XML  

爲減少DOM、SAX的編碼量,出現了JDOM;優點:20-80原則,極大減少了代碼量。使用場合:要實現的功能簡單,如解析、創建等,但在底層,JDOM還是使用SAX(最常用)、DOM、Xanan文檔。

import java.io.FileNotFoundException;   
import java.io.FileOutputStream;   
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;   
import org.jdom.output.XMLOutputter;   
/**  
*   
* @author hongliang.dinghl  
* JDOM 生成與解析XML文檔  
*   
*/  
public class JDomDemo implements XmlDocument {   

public void createXml(String fileName) {   
Document document;   
Element  root;   
root=new Element("employees");   
document=new Document(root);   
Element employee=new Element("employee");   
root.addContent(employee);   
Element name=new Element("name");   
name.setText("ddvip");   
employee.addContent(name);   
Element sex=new Element("sex");   
sex.setText("m");   
employee.addContent(sex);   
Element age=new Element("age");   
age.setText("23");   
employee.addContent(age);   
XMLOutputter XMLOut = new XMLOutputter();   
try {   
XMLOut.output(document, new FileOutputStream(fileName));   
} catch (FileNotFoundException e) {   
e.printStackTrace();   
} catch (IOException e) {   
e.printStackTrace();   
}   

}   

public void parserXml(String fileName) {   
SAXBuilder builder=new SAXBuilder(false);    
try {   
Document document=builder.build(fileName);   
Element employees=document.getRootElement();    
List employeeList=employees.getChildren("employee");   
for(int i=0;iElement employee=(Element)employeeList.get(i);   
List employeeInfo=employee.getChildren();   
for(int j=0;jSystem.out.println(((Element)employeeInfo.get(j)).getName()+":"+((Element)employeeInfo.get(j)).getValue());   

}   
}   
} catch (JDOMException e) {   

e.printStackTrace();   
} catch (IOException e) {   

e.printStackTrace();   
}    

}   
}   
  




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章