XML解析

DOM(Document Object Model),

DTD(Document Type Definition),

SAX(Simple API for XML),

XSD(Xml Schema Definition),

XSLT(Extensible Stylesheet Language Transformations)


1.DOM生成和解析XML文档(JAXP Crimson解析器)

分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。
package com.alisoft.facepay.framework.bean; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
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; 
	public void init() { 
		try { 
			DocumentBuilderFactory factory = DocumentBuilderFactory 
			.newInstance(); 
			DocumentBuilder builder = factory.newDocumentBuilder(); 
			this.document = builder.newDocument(); 
		} catch (ParserConfigurationException e) { 
			System.out.println(e.getMessage()); 
		} 
	} 
	public void createXml(String fileName) { 
		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, "gb2312"); 
			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()); 
		} 
	} 
	public void parserXml(String fileName) { 
		try { 
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
			DocumentBuilder db = dbf.newDocumentBuilder(); 
			Document document = db.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 (FileNotFoundException e) { 
			System.out.println(e.getMessage()); 
		} catch (ParserConfigurationException e) { 
			System.out.println(e.getMessage()); 
		} catch (SAXException e) { 
			System.out.println(e.getMessage()); 
		} catch (IOException e) { 
			System.out.println(e.getMessage()); 
		} 
	} 
}



2.SAX生成和解析XML文档

SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag.特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。
package com.alisoft.facepay.framework.bean;   
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 {   
	public void createXml(String fileName) {   
		System.out.println("<<"+filename+">>");   
	}   
	public void parserXml(String fileName) {   
		SAXParserFactory saxfac = SAXParserFactory.newInstance();   
		try {   
			SAXParser saxparser = saxfac.newSAXParser();   
			InputStream is = new FileInputStream(fileName);   
			saxparser.parse(is, new MySAXHandler());   
		} catch (ParserConfigurationException e) {   
			e.printStackTrace();   
		} catch (SAXException e) {   
			e.printStackTrace();   
		} catch (FileNotFoundException e) {   
			e.printStackTrace();   
		} catch (IOException e) {   
			e.printStackTrace();   
		}   
	}   
}   
class MySAXHandler extends DefaultHandler {   
	boolean hasAttribute = false;   
	Attributes attributes = null;   
	public void startDocument() throws SAXException {   
		System.out.println("文档开始打印了");   
	}   
	public void endDocument() throws SAXException {   
		System.out.println("文档打印结束了");   
	}   
	public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {   
		if (qName.equals("employees")) {   
			return;   
		}   
		if (qName.equals("employee")) {   
			System.out.println(qName);   
		}   
		if (attributes.getLength() > 0) {   
			this.attributes = attributes;   
			this.hasAttribute = true;   
		}   

	}   
	public void endElement(String uri, String localName, String qName)  throws SAXException {   
		if (hasAttribute && (attributes != null)) {   
			for (int i = 0; i < attributes.getLength(); i++) {   
				System.out.println(attributes.getQName(0) + attributes.getValue(0));   
			}   
		}   
	}   
	public void characters(char[] ch, int start, int length)  throws SAXException {   
		System.out.println(new String(ch, start, length));   
	}   
}  

3.DOM4J生成和解析XML文档

package com.alisoft.facepay.framework.bean;   
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——http://www.jdom.org

JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题”(根据学习曲线假定为20%)。
package com.alisoft.facepay.framework.bean;   
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();   
	}    
}   
}   



比较


1)DOM4J性能最好,连Sun的JAXM也在用DOM4J.目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J.

2)JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM.虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在JavaScript中使用DOM)。

3)SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值