博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XML解析
阅读量:4290 次
发布时间:2019-05-27

本文共 10783 字,大约阅读时间需要 35 分钟。

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——

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流被读入时,会有部分文档暂时隐藏在内存中)。

转载地址:http://ybegi.baihongyu.com/

你可能感兴趣的文章
一些精致小众网站收集录
查看>>
计算机科学探秘之linux发展史
查看>>
程序员每天早上早来10分钟的好处
查看>>
互联网30年,泡沫如梦,一个个泡沫和风口过后,会是什么样的结局
查看>>
升级centos 6.8 服务器的gcc
查看>>
API网关在微服务架构中的应用,这一篇就够了
查看>>
JVM发生内存溢出的8种原因、及解决办法
查看>>
SpringBoot2.0 基础案例(12):基于转账案例,演示事务管理操作
查看>>
高性能负载均衡:nginx搭建tomcat集群
查看>>
Spring切面中的正则表达式
查看>>
一直再说高并发,多少QPS才算高并发?
查看>>
Git恢复之前版本的两种方法reset、revert(图文详解)
查看>>
Maven打包的三种方式
查看>>
电商场景:并发扣库存,怎么保证不超卖又不影响并发性能
查看>>
分布式事务处理方式总结
查看>>
延迟队列有哪些实现方案?说说你的看法
查看>>
厉害了!我们老大半小时把我的springboot项目并发提升几倍
查看>>
Spring 中Bean 的生命周期
查看>>
为什么要用枚举实现单例模式(避免反射、序列化问题)
查看>>
微服务架构下的分布式限流方案思考
查看>>