知识点--xml的几种方式的原理及特点

来源:互联网 发布:儿童奶酪 知乎 编辑:程序博客网 时间:2024/06/05 16:43

原文:http://blog.csdn.net/yuan16423276/article/details/17385867
最常用的是sax、dom、pull、dom4j,而android中用的比较多的是 sax(Simple APIs for XML)、dom(Document Object Model)、pull,其中pull在这三个中又最为适用。
SAX

sax是一个用于处理xml事件驱动的“推”模型;

优点:解析速度快,占用内存少,它需要哪些数据再加载和解析哪些内容。

缺点:它不会记录标签的关系,而是需要应用程序自己处理,这样就会增加程序的负担。
DOM

dom是一种文档对象模型;

优点:dom可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构,dom技术使得用户页面可以动态的变化,如动态显示隐藏一个元素,改变它的属性,增加一个元素等,dom可以使页面的交互性大大增强。

缺点:dom解析xml文件时会将xml文件的所有内容以文档树方式存放在内存中。
PULL

pull和sax很相似,区别在于:pull读取xml文件后触发相应的事件调用方法返回的是数字,且pull可以在程序中控制,想解析到哪里就可以停止解析。 (SAX解析器的工作方式是自动将事件推入事件处理器进行处理,因此你不能控制事件的处理主动结束;而Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。pull是一个while循环,随时可以跳出,而sax不是,sax是只要解析了,就必须解析完成。)

举例

<?xml version="1.0" encoding="UTF-8"?>   <employees>   <employee>   <name>ddviplinux</name>   <sex>m</sex>   <age>30</age>   </employee>   </employees> 

首先定义一个操作XML文档的接口XmlDocument 它定义了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.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文档
为解决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 {   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));   }   }