加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML解析

发布时间:2020-12-16 05:42:43 所属栏目:百科 来源:网络整理
导读: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(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 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流被读入时,会有部分文档暂时隐藏在内存中)。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读