Java 解析xml文档笔记(SAX,DOM,DOM4J)
2012-08-30 17:11
696 查看
工程全部代码看文章最后的附件!!!
要解析的xml文档:employess.xml
封装解析出来的数据:Employee.java
解析xml文档的工具类:XMLParserUtil.java
SAX解析时用到事件处理器类:MyXmlHandler.java
附件下载地址:http://download.csdn.net/detail/xiaojianfengye1/4537323
要解析的xml文档:employess.xml
<?xml version="1.0" encoding="UTF-8" ?> <!-- 员工信息 --> <employees> <employee id="0001"> <name>张三</name> <age>23</age> <sex>男</sex> <birthday>2012-07-24</birthday> </employee> <employee id="0002"> <name>李四</name> <age>20</age> <sex>女</sex> <birthday>1992-06-03</birthday> </employee> <employee id="0003"> <name>王五</name> <age>21</age> <sex>男</sex> <birthday>2012-03-27</birthday> </employee> <employee id="0004"> <name>赵六</name> <age>18</age> <sex>女</sex> <birthday>1992-06-03</birthday> </employee> </employees>
封装解析出来的数据:Employee.java
package com.maple.domain; import java.util.Date; public class Employee { private String id; private String name; private Integer age; private String sex; private Date birthday; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public String toString() { return "Employee [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + ", birthday=" + birthday + "]"; } }
解析xml文档的工具类:XMLParserUtil.java
package com.maple.util; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.dom4j.io.SAXReader; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import com.maple.domain.Employee; /** * XMLParserUtil.java * @author 小建枫叶 2012-8-30 下午2:14:08 * * TODO 解析xml的工具类 */ public class XMLParseUtil { //私有化构造函数,工具类不需要被实例化 private XMLParseUtil() { } /** * 使用SAX解析xml * * 特点: * 1.事件驱动解析,边读边解析,无需等xml文档读取完成再解析; * 2.是只读的,即只能解析xml文档的内容,不能修改和删除其内容 * 3.需要解析器和事件处理器,并且解析器依赖于事件处理器 * * 步骤: * 1.创建xml事件处理器类,一般都是继承DefaultHandler; * 2.创建一个解析工厂SAXParserFactory对象,通过解析工厂对象创建解析器SAXParser对象; * 3.通过解析器对象的parse方法真正解析xml文档,要传入一个事件处理类的对象(解析器依赖于事件处理器)。 * * @param xmlName xml文件的名称,必须放在classpath * @return List<Employee> */ public static List<Employee> parseBySAX(String xmlName) { try { SAXParserFactory parserFactory = SAXParserFactory.newInstance(); //创建一个解析工厂 SAXParser parser = parserFactory.newSAXParser(); //通过工厂创建一个xml解析器 MyXmlHandler handler = new MyXmlHandler(); //创建xml解析处理类对象,自定义的,继承了DefaultHandler类 InputStream is = XMLParseUtil.class.getClassLoader().getResourceAsStream(xmlName); //通过类加载器获取在classpath下xml文件的输入流 parser.parse(is, handler); //解析xml,这里有很多重载的方法,看自己的需要使用 List<Employee> employees = handler.getEmployees(); //解析完毕后调用该方法获取到的集合就是有内容的了。必须在执行了parser方式后调用才有内容。 return employees; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 使用DOM解析xml * * 特点: * 1.解析的时候需要将整个xml文档读到内存中,形成DOM树; * 2.如果xml文档特别大,将会消耗计算机的大量内存,容易造成内存溢出; * 3.可以对xml文档进行增删改查。 * * 步骤: * 1.通过DocumentBuilderFactory.newInstance()创建DocumentBuilderFactory对象; * 2.通过DocumentBuilderFactory对象的newDocumentBuilder方法创建DocumentBuilder对象; * 3.通过DocumentBuilder对象的parse方法创建Document对象; * 4.通过Document对象获取xml文档的根节点,再通过根节点获取指定名字的子节点,然后迭代取值。 * 读取--->得到根节点--->迭代 * 注意: * 该方法使用到的关于解析xml的类都是org.w3c开头的包下的 * * @param xmlName * @return List<Employee> */ public static List<Employee> parseByDOM(String xmlName) { try { /* * 一下四行代码是为了得到一个文档Document对象,这个文档可以理解为要解析的xml文档的所有内容, * 执行完这四行代码,整个xml文件就被读到内存中了 */ DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); //创建一个DocumentBuilderFactory对象 DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder(); //通过DocumentBuilderFactory对象创建DocumentBuilder对象 InputStream is = XMLParseUtil.class.getClassLoader().getResourceAsStream(xmlName); //通过类加载器获取在classpath下xml文件的输入流 Document document = documentBuilder.parse(is); //通过DocumentBuilder对象解析指定的xml文档返回一个Document对象 // Document document = documentBuilder.newDocument(); //这个方法是在内存中新创建一个xml文件,注意是内存中,该xml文档不包含任何节点 Element rootElement = document.getDocumentElement(); //得到xml文档的根节点 NodeList nodeList = rootElement.getElementsByTagName("employee"); //得到根节点下指定名字的子节点 List<Employee> employees= new ArrayList<Employee>(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); for (int i = 0; i < nodeList.getLength(); i++) { //迭代 Element element = (Element) nodeList.item(i); //取出每个子节点 String id = element.getAttribute("id"); //得到节点中指定属性名的值 String name = element.getElementsByTagName("name").item(0).getTextContent(); //因为在xml文档中每个子节点下只有一个name节点,所以可以用item(0),取第一个节点 String age = element.getElementsByTagName("age").item(0).getTextContent(); String sex = element.getElementsByTagName("sex").item(0).getTextContent(); Date birthday = dateFormat.parse(element.getElementsByTagName("birthday").item(0).getTextContent()); Employee employee = new Employee(); employee.setId(id); employee.setName(name); employee.setAge(Integer.parseInt(age)); employee.setSex(sex); employee.setBirthday(birthday); employees.add(employee); } return employees; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 使用DOM4J解析xml * * 特点: * 1.简单易用,和DOM解析类似 * * @param xmlName * @return List<Employee> */ public static List<Employee> parseByDOM4J(String xmlName) { try { //一下三行将xml文档读取到内存中 SAXReader saxReader = new SAXReader(); InputStream is = XMLParseUtil.class.getClassLoader().getResourceAsStream(xmlName); //通过类加载器获取在classpath下xml文件的输入流 org.dom4j.Document document = saxReader.read(is); //该方法有多个重载的,看需求使用 org.dom4j.Element rootElement = document.getRootElement(); //得到xml文档的根节点 List<Employee> employees= new ArrayList<Employee>(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); Iterator<?> it = rootElement.elementIterator("employee"); while(it.hasNext()) { org.dom4j.Element element = (org.dom4j.Element) it.next(); String id = element.attributeValue("id"); String name = element.elementText("name"); String age = element.elementText("age"); String sex = element.elementText("sex"); Date birthday = dateFormat.parse(element.elementText("birthday")); Employee employee = new Employee(); employee.setId(id); employee.setName(name); employee.setAge(Integer.parseInt(age)); employee.setSex(sex); employee.setBirthday(birthday); employees.add(employee); } return employees; } catch (Exception e) { e.printStackTrace(); } return null; } }
SAX解析时用到事件处理器类:MyXmlHandler.java
package com.maple.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import com.maple.domain.Employee; /** * MyXmlHandler.java * @author 小建枫叶 2012-8-30 下午2:16:52 * * TODO SAX解析xml的事件处理器类 * 要注意的问题: * 1.在startElement方法中是用qName来比较,不是localName; * 2.应该在startElement方法的最后一行代码中记录当前的正在解析的节点,在endElement方法的最后一行代码中将当前解析的节点设置为null; * 3.在characters方式用equals方法时要用这个的格式("name".equals(currTag)),防止出现空指针异常。 */ public class MyXmlHandler extends DefaultHandler { private List<Employee> employees;//存放解析出来的每个Employee对象 private Employee employee; //每个解析出来的Emloyee对象,将会放到List<Employee>集合中 private String currTag; //用于标记当前解析的节点 public List<Employee> getEmployees() { return employees; } @Override public void startDocument() throws SAXException { //开始解析xml文档的时候创建一个集合 employees = new ArrayList<Employee>(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //开始解析每个节点,即说明解析真正开始 if(qName.equals("employee")) { //注意,这里是用qName来比较,不是localName,localName是和命名空间有关的 //如果是employee节点就创建一个Employee对象 employee = new Employee(); String id = attributes.getValue("id"); //得到该节点上指定属性名的值 employee.setId(id); } currTag = qName; //记录当前解析的节点,在characters方法中要用到 } @Override public void characters(char[] ch, int start, int length) throws SAXException { String data = new String(ch, start, length); //取出解析出来的内容,并根据当前正在解析的节点,设置到Employee对象对象的属性上 if("name".equals(currTag)) { employee.setName(data); } else if("age".equals(currTag)) { employee.setAge(Integer.parseInt(data)); } else if("sex".equals(currTag)) { employee.setSex(data); } else if("birthday".equals(currTag)) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); try { employee.setBirthday(dateFormat.parse(data)); } catch (ParseException e) { e.printStackTrace(); } } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(qName.equals("employee")) { //说明解析结束 employees.add(employee); //将解析出来的对象放到集合中,一定要记得添加,否则在调用getEmployees方式时得到的集合是木有内容滴。 // employee = null; //这句有没有都没有多大问题 } currTag = null; //不能省,且必须放在外面 } }
附件下载地址:http://download.csdn.net/detail/xiaojianfengye1/4537323
相关文章推荐
- Java之DOM,SAX,JDOM,DOM4J,四种解析xml方法比较
- Java中Xml解析详解 DOM、SAX、JDOM、DOM4J
- java解析xml的方式DOM,SAX,DOM4J,JDOM,StAX
- java--DOM4j-SAXReader对xml文档的解析2
- XML文档解析DOM、SAX、JDOM、DOM4j、XPath
- 四种方法解析XML文档:Dom、SAX、JDOM、dom4j
- Java中使用DOM方式解析和创建XML文档、及dom4j使用简介
- java解析xml方法:DOM解析、SAX解析、JDOM解析、DOM4J解析
- JAVA解析XML的方式DOM、SAX、DOM4J、JDOM、StAX之详解与比较
- JAVA解析XML的方式DOM、SAX、DOM4J、JDOM、StAX之详解与比较
- JAVA解析XML的方式DOM、SAX、DOM4J、JDOM、StAX之比较
- java解析xml的4种方式:1、Dom,2、SAX,3、Jdom,4、dom4j
- 四种方法解析XML文档:Dom、SAX、JDOM、dom4j
- XML文档常用解析方式DOM、SAX、JDOM、DOM4J的比较
- java 解析xml的四种方式:sax,dom,dom4j,jdom
- Java 解析XML文档(DOM & SAX)
- java--DOM4j-SAXReader对xml文档的解析2
- JAVA解析XML的方式DOM、SAX、DOM4J、JDOM、StAX之比较
- xml文档解析之DOM、SAX、JDOM、Dom4J总结
- Java解析xml、解析xml四种方法、DOM、SAX、JDOM、DOM4j、XPath