XML是一种非常常见的数据存储方式,有四种解析方式,DOM、SAX、JDOM、DOM4J四种解析方式。其中DOM、SAX是Java中自带的,JDOM、DOM4J需要添加jar包。
接着就是对这四种XML文件解析方式进行总结。
XML解析
1.SAX
/** * 通过SAX方法对XML文件进行解析 * 基于事件驱动的一种解析方式 * 优点: * 适用于只需处理xml中的数据时 * 事件驱动,内存耗费少 * 缺点: * 不易编码 * 一般不能同时访问到同一个xml文件中的多处数据 * 用法:新建一个类继承自DefalutHandler并重写5个方法 * 调用顺序 : * statrDocument()在解析开始时调用 * startElement()在开始解析到节点开始标签时调用 * characters()在解析到节点之间的内容时调用 * endElement()在解析到节点结束便签时调用 * endDoucument()在解析结束时调用 */ public static void parseXMLBySAX(String path) { //创建SAXParserFactory对象 SAXParserFactory factor=SAXParserFactory.newInstance(); try { //通过SAXParserFactory创建出SAXParser的对象 SAXParser parser=factor.newSAXParser(); //创建出DefaultHandler继承类的对象 SAXHandler handler=new SAXHandler(); try { //进行解析 parser.parse(path, handler); for (Book book : handler.bookList) { System.out.println(book.toString()); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public class SAXHandler extends DefaultHandler { int bookNumber=1; Book book; ListbookList=new ArrayList(); String value; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO Auto-generated method stub super.startElement(uri, localName, qName, attributes); if(qName.equals("Book")) { System.out.println("开始解析第"+bookNumber+"本书"); bookNumber++; int number=attributes.getLength(); book=new Book(); for (int i = 0; i < number; i++) { System.out.println(attributes.getQName(i)+"="+attributes.getValue(i)); book.setId(attributes.getValue(i)); } }else if(!qName.equals("Book")&&!qName.equals("BookStore")) { System.out.print(qName+":"); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, qName); if(qName.equals("Book")) { bookList.add(book); book=null; }else if(qName.equals("name")) { book.setName(value); }else if (qName.equals("price")) { book.setName(value); }else if (qName.equals("author")) { book.setAuthor(value); } } @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); System.out.println("---------------开始解析-----------------"); } @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); System.out.println("------------结束解析-----------------------"); } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub super.characters(ch, start, length); value=new String(ch,start,length); if(!value.trim().equals("")) { System.out.println(value); } } }
2.DOM
/** * 通过DOM解析XML文件 * 优点: * 形成树结构,直观好理解,便于代码修改 * 解析过程中树结构保存在内存中,方便修改 * 缺点: * 当xml文件太大时,会耗损大量内存,导致内存溢出 */ public static void parseXMLByDom(String path) { //创建DocumentBuilderFactory的对象 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); try { //通过DocumentBuilderFactory对象创建出DocumentBuilder对象 DocumentBuilder builder=factory.newDocumentBuilder(); Document document; try { //通过DocumentBuilder对象进行解析 返回值为Document document = builder.parse(path); //得到Book节点 NodeList list=document.getElementsByTagName("Book"); for (int i = 0; i < list.getLength(); i++) { // Node node=list.item(i); //获得Book节点的子节点 NodeList childList=node.getChildNodes(); for (int j = 0; j < childList.getLength(); j++) { Node childNode=childList.item(j); //判断空格 if (childNode.getNodeType()==Node.ELEMENT_NODE) { System.out.println(childNode.getNodeName()+"="+childNode.getFirstChild().getNodeValue()); } } } } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
3.JDOM
/** * 使用JDOM进行XML类型数据进行解析 * 需要添加Jar包 * 优点: * 大量使用具体类而不是接口 * API大量使用Collections类 熟悉Collections类可以很方便 */ public static void parseXMLByJDOM(String path) { SAXBuilder build=new SAXBuilder(); Book book; ListbookListEntity=new ArrayList(); try { InputStream in=new FileInputStream(path); org.jdom2.Document document=build.build(in); //获取根节点BookStore节点 Element rootElement= document.getRootElement(); //获取根节点的子节点Book节点 List bookList=rootElement.getChildren(); //解析Book节点 for (Element element:bookList) { System.out.println("开始解析第"+(bookList.indexOf(element)+1)+"本书"); book=new Book(); //解析Book节点的属性 List childAttribute=element.getAttributes(); //解析Book节点的属性和名称 for (Attribute attribute : childAttribute) { System.out.println(attribute.getName()+"="+attribute.getValue()); book.setId(attribute.getValue()); } //解析Book节点的子节点 List childList=element.getChildren(); for (Element element2 : childList) { String strName=element2.getName(); String strValue=element2.getValue(); System.out.println(strName+"="+strValue); if(strName.equals("name")) { book.setName(strValue); }else if(strName.equals("author")) { book.setAuthor(strValue); }else if(strName.equals("price")) { book.setPrice(strValue); } } bookListEntity.add(book); book=null; System.out.println("结束解析第"+(bookList.indexOf(element)+1)+"本书"); } System.out.println("-------------------------------------------------------------"); for (Book bookEntity : bookListEntity) { System.out.println(bookEntity.toString()); } }catch (FileNotFoundException e) { e.printStackTrace(); }catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
4.DOM4J
/*** 使用DOM4J对XML类型数据进行解析 * 需要添加Jar包 * 优点: * JDOM的智能分支合并了许多超出XML文档表示的功能 * 使用接口和抽象类 * 开源 */ public static void parseXMLByDOM4J(String path) { SAXReader reader=new SAXReader(); ArrayList<Book> bookEntityList=new ArrayList(); Book bookEntity; try { org.dom4j.Document document=reader.read(new File(path)); org.dom4j.Element bookStore=document.getRootElement(); Iterator it=bookStore.elementIterator(); int i=1; while(it.hasNext()) { System.out.println("开始解析第"+i+"本书"); bookEntity=new Book(); org.dom4j.Element book=(org.dom4j.Element) it.next(); List<org.dom4j.Attribute> attributes=book.attributes(); for (org.dom4j.Attribute attr : attributes) { System.out.println(attr.getName()+"="+attr.getValue()); bookEntity.setId(attr.getValue()); } Iterator bookIt=book.elementIterator(); while(bookIt.hasNext()) { org.dom4j.Element bookChildElement=(org.dom4j.Element) bookIt.next(); String bookChildName=bookChildElement.getName(); String bookChildValue=bookChildElement.getStringValue(); if(bookChildName.equals("name")) { bookEntity.setName(bookChildValue); }else if(bookChildName.equals("price")) { bookEntity.setPrice(bookChildValue); }else if(bookChildName.equals("author")) { bookEntity.setAuthor(bookChildValue); } System.out.println(bookChildName+"="+bookChildValue); } bookEntityList.add(bookEntity); bookEntity=null; System.out.println("结束解析第"+i+"本书"); i++; } System.out.println("---------------------------------------------------------"); for (Book book : bookEntityList) { System.out.println(book.toString()); } } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } }</pre>