Myhandler
package com.heli.xml.sax; /** * 用SAX解析XML的Handler */ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class Myhandler extends DefaultHandler { // 存储正在解析的元素的数据 private Map<String, String> map = null; // 存储所有解析的元素的数据 private List<Map<String, String>> list = null; // 正在解析的元素的名字 String currentTag = null; // 正在解析的元素的元素值 String currentValue = null; // 开始解析的元素 String nodeName = null; public Myhandler(String nodeName) { // TODO Auto-generated constructor stub this.nodeName = nodeName; } public List<Map<String, String>> getList() { return list; } // 开始解析文档,即开始解析XML根元素时调用该方法 @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub //System.out.println("--startDocument()--"); // 初始化Map list = new ArrayList<Map<String, String>>(); } // 开始解析每个元素时都会调用该方法 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO Auto-generated method stub // 判断正在解析的元素是不是开始解析的元素 //System.out.println("--startElement()--" + qName); if (qName.equals(nodeName)) { map = new HashMap<String, String>(); } // 判断正在解析的元素是否有属性值,如果有则将其全部取出并保存到map对象中,如:<person id="00001"></person> if (attributes != null && map != null) { for (int i = 0; i < attributes.getLength(); i++) { map.put(attributes.getQName(i), attributes.getValue(i)); } } currentTag = qName; // 正在解析的元素 } // 解析到每个元素的内容时会调用此方法 @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub //System.out.println("--characters()--"); if (currentTag != null && map != null) { currentValue = new String(ch, start, length); // 如果内容不为空和空格,也不是换行符则将该元素名和值和存入map中 if (currentValue != null && !currentValue.trim().equals("") && !currentValue.trim().equals("\n")) { map.put(currentTag, currentValue); //System.out.println("-----" + currentTag + " " + currentValue); } // 当前的元素已解析过,将其置空用于下一个元素的解析 currentTag = null; currentValue = null; } } // 每个元素结束的时候都会调用该方法 @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub //System.out.println("--endElement()--" + qName); // 判断是否为一个节点结束的元素标签 if (qName.equals(nodeName)) { list.add(map); map = null; } } // 结束解析文档,即解析根元素结束标签时调用该方法 @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub //System.out.println("--endDocument()--"); super.endDocument(); } }
SaxService
package com.heli.xml.sax; /** * 封装解析业务类 */ import java.util.List; import java.util.Map; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; public class SaxService { public static List<Map<String, String>> ReadXML(String uri, String NodeName) { try { // 创建一个解析XML的工厂对象 SAXParserFactory parserFactory = SAXParserFactory.newInstance(); // 创建一个解析XML的对象 SAXParser parser = parserFactory.newSAXParser(); // 创建一个解析助手类 Myhandler myhandler = new Myhandler("uncall"); parser.parse(uri, myhandler); return myhandler.getList(); } catch (Exception e) { e.printStackTrace(); } finally { } return null; } }
XmlSaxTest
package com.heli.xml.sax; /** * 程序入口 */ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class XmlSaxTest { /** * @param args */ public static void main(String[] args) { ArrayList<Map<String, String>> list = (ArrayList<Map<String, String>>) SaxService.ReadXML("e:\\test.xml", "class"); for (int i = 0; i < list.size(); i++) { HashMap<String, String> temp = (HashMap<String, String>) list.get(i); Iterator<String> iterator = temp.keySet().iterator(); while (iterator.hasNext()) { String key = iterator.next().toString(); String value = temp.get(key); System.out.println("key:"+key + "--value:" + value ); } } System.out.println("--------------------------------------"); System.out.println(list.toString()); } }
test.xml
<?xml version="1.0" encoding="utf-8"?> <uncall> <result>1</result> <OnClickCall> <Response>success</Response> <ActionID>123456</ActionID> <Message>Originate successfully queued</Message> </OnClickCall> </uncall>
时间: 2024-10-13 04:31:53