SAX解析xml 例子使用

来源:互联网 发布:散户坑 彩虹桥源码公式 编辑:程序博客网 时间:2024/06/03 01:43


现在有一份这样的DOM的xml文件,解析放在list里边

a.xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><root xmlns="http://xxx.com/rootResponse"><code>10</code><msg/><DATA><person_list><person><A>a</A><B>b</B><C>c</C><D>d</D><E>e</E><F>f</F><G>g</G><H>h</H><I>i</I></person><person><A>a</A><B>b</B><C>c</C><D>d</D><E>e</E><F>f</F><G>g</G><H>h</H><I>i</I></person></person_list></DATA></root></soapenv:Body></soapenv:Envelope>



解析代码:

package xx.utils;import java.io.IOException;import java.util.ArrayList;import java.util.List;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;public class XMLUtil extends DefaultHandler {/**      *  xml 解析结果      */      public static List<Person> personList;            private Person person;            private String node;            private StringBuilder sb;            private boolean flag = false;            public void startDocument () throws SAXException {            //开始解析文档            super.startDocument();          personList = new ArrayList<Person>();          System.out.println("文档解析开始startDocument");    }            public void endDocument () throws SAXException {            //文档解析结束            super.endDocument();          System.out.println("文档解析结束endDocument");        for(Person p: personList) {        System.out.println("personLID:" + p.getA());        }    }            public void startElement (String uri, String localName, String qName, Attributes attributes) throws SAXException {            //开始解析节点            super.startElement(uri, localName, qName, attributes);          flag = true;          if( qName.equals("person")){              person = new Person();          }          node = qName;          sb = new StringBuilder();          System.out.println("节点解析开始startElement,内容:"+sb.toString());    }                public void characters (char[] ch, int start, int length) throws SAXException {            //保存节点内容            super.characters(ch, start, length);          if(!flag) {                return;            }            sb.append(new String(ch, start, length) );          System.out.println("节点解析characters,内容:"+sb.toString());    }                public void endElement (String uri, String localName, String qName) throws SAXException {     System.out.println("endElement中,内容:");          //结束解析节点            super.endElement(uri, localName, qName);          flag = false;           if( qName.equals("person")){              personList.add(person);          }          String s = sb.toString();          switch (node) {              case "A":                    person.setA(s);                  break;              case "B":              person.setB(s);             break;              case "C":              person.setC(s);             break;              case "D":              person.setD(s);             break;              case "E":              person.setE(s);             break;              case "F":              person.setF(s);             break;              case "G":              person.setG(s);             break;              case "H":              person.setH(s);             break;              case "I":              person.setI(s);             break;              default:                  break;         }              }            class Person{    private String A;    private String B;    private String C;    private String D;    private String E;    private String F;    private String G;    private String H;    private String I;public String getA() {return A;}public void setA(String a) {A = a;}public String getB() {return B;}public void setB(String b) {B = b;}public String getC() {return C;}public void setC(String c) {C = c;}public String getD() {return D;}public void setD(String d) {D = d;}public String getE() {return E;}public void setE(String e) {E = e;}public String getF() {return F;}public void setF(String f) {F = f;}public String getG() {return G;}public void setG(String g) {G = g;}public String getH() {return H;}public void setH(String h) {H = h;}public String getI() {return I;}public void setI(String i) {I = i;}        }        public static void main(String args[]) {    SAXParserFactory factory = SAXParserFactory.newInstance();          SAXParser saxParser;try {saxParser = factory.newSAXParser();try {saxParser.parse("C:\\Users\\Administrator\\Desktop\\a.xml", new XMLUtil());} catch (IOException e) {e.printStackTrace();} } catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();}  }}



解析过程,程序执行的先后顺序:

文档解析开始startDocument节点解析开始startElement,内容:节点解析characters,内容:节点解析开始startElement,内容:节点解析characters,内容:节点解析开始startElement,内容:节点解析characters,内容:节点解析开始startElement,内容:节点解析characters,内容:10endElement中,内容:节点解析开始startElement,内容:endElement中,内容:节点解析开始startElement,内容:节点解析characters,内容:节点解析开始startElement,内容:节点解析characters,内容:节点解析开始startElement,内容:节点解析characters,内容:节点解析开始startElement,内容:节点解析characters,内容:aendElement中,内容:节点解析开始startElement,内容:节点解析characters,内容:bendElement中,内容:节点解析开始startElement,内容:节点解析characters,内容:cendElement中,内容:节点解析开始startElement,内容:节点解析characters,内容:dendElement中,内容:节点解析开始startElement,内容:节点解析characters,内容:eendElement中,内容:节点解析开始startElement,内容:节点解析characters,内容:fendElement中,内容:节点解析开始startElement,内容:节点解析characters,内容:gendElement中,内容:节点解析开始startElement,内容:节点解析characters,内容:hendElement中,内容:节点解析开始startElement,内容:节点解析characters,内容:iendElement中,内容:endElement中,内容:节点解析开始startElement,内容:节点解析characters,内容:节点解析开始startElement,内容:节点解析characters,内容:aendElement中,内容:节点解析开始startElement,内容:节点解析characters,内容:bendElement中,内容:节点解析开始startElement,内容:节点解析characters,内容:cendElement中,内容:节点解析开始startElement,内容:节点解析characters,内容:dendElement中,内容:节点解析开始startElement,内容:节点解析characters,内容:eendElement中,内容:节点解析开始startElement,内容:节点解析characters,内容:fendElement中,内容:节点解析开始startElement,内容:节点解析characters,内容:gendElement中,内容:节点解析开始startElement,内容:节点解析characters,内容:hendElement中,内容:节点解析开始startElement,内容:节点解析characters,内容:iendElement中,内容:endElement中,内容:endElement中,内容:endElement中,内容:endElement中,内容:endElement中,内容:endElement中,内容:文档解析结束endDocumentpersonLID:apersonLID:a


最后来个升级版XMLUtil

import java.io.IOException;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.apache.log4j.Logger;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;/** * SAX解析DOM工具 * @author XXX * @time 2017年3月10日 上午11:57:08 * @version:1.0 * @param <T> */public class XMLUtil<T> extends DefaultHandler{    public  List<T> elementList;            private T t;            private String elementTag;            private StringBuilder sb;            private boolean flag = false;          ElementDataListener<T> elementDataListener;private Class<T> clazz;/** * 要解析的最终实体,例如EMP、Person,Student */private String tagModel;private static Logger LOG = Logger.getLogger(XMLUtil.class);private static SAXParserFactory factory;    public XMLUtil(ElementDataListener<T> empDataListener,Class<T> clazz,String tagModel) {super();this.elementDataListener = empDataListener;this.clazz = clazz;this.tagModel = tagModel;}        public static SAXParser getSaxParser(){    SAXParserFactory factory = getFactory();SAXParser saxParser=null;try {saxParser = factory.newSAXParser();} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();}return saxParser;    }public void startDocument () throws SAXException {            //开始解析文档            super.startDocument();          elementList = new ArrayList<T>();      }            public void endDocument () throws SAXException {            //文档解析结束            super.endDocument();        if (elementDataListener != null) {        elementDataListener.onGetElementData(elementList);        }    }            public void startElement (String uri, String localName, String qName, Attributes attributes) throws SAXException {            //开始解析节点            super.startElement(uri, localName, qName, attributes);          flag = true;          if( qName.equals(tagModel)){              try {              t = clazz.newInstance();                               } catch (InstantiationException e) {                  e.printStackTrace();                  LOG.error("--", e);            } catch (Exception e) {                  e.printStackTrace();                  LOG.error("--", e);            }          }          elementTag = qName;          sb = new StringBuilder();      }                public void characters (char[] ch, int start, int length) throws SAXException {            //保存节点内容            super.characters(ch, start, length);          if(!flag) {                return;            }            sb.append(new String(ch, start, length) );      }                public void endElement (String uri, String localName, String qName) throws SAXException {         //结束解析节点            super.endElement(uri, localName, qName);          flag = false;           if( qName.equals(tagModel)){              elementList.add(t);          }          String elementValue = sb.toString();          elementDataListener.onSetElementDataToList(elementTag,elementValue,t);              }       interface ElementDataListener<T> {   /**    * 返回解析DOM结果    * @param empList 员工信息集合    */   public void onGetElementData(List<T> elementList);   /**    * 节点解析对应模板,switch分支来解析    * 例如:    * switch(elementTag){    *  case"name":    *  t.setName(elementValue);    *  break;    *   case"Age":    *  t.setAge(elementValue);    *  break;    * }    *     * @param elementTag    * @param elementValue    * @param t    */   public void onSetElementDataToList(String elementTag,String elementValue,T t);   }   public void setEmpDataListener(ElementDataListener<T> elementDataListener) {   this.elementDataListener = elementDataListener;   }   public static SAXParserFactory getFactory() {   return (factory == null) ? SAXParserFactory.newInstance():factory;   }    @SuppressWarnings({ "unchecked", "rawtypes" })public static void main(String args[]) {ElementDataListener eleListener = new ElementDataListener<xxx.Person>() {@Overridepublic void onSetElementDataToList(String elementTag,String elementValue, xxx.Person t) {switch (elementTag) {case "A":t.setA(elementValue);break;case "B":t.setB(elementValue);break;//....default:break;}}@Overridepublic void onGetElementData(List<xxx.Person> elementList) {for (xxx.Person e : elementList) {System.out.println("打印结果: \t" + e.getCONBGN_DT());}}};try {if (XMLUtil.getSaxParser() != null)XMLUtil.getSaxParser().parse("C:\\Users\\Administrator\\Desktop\\a.xml",new XMLUtil(eleListener,xxx.Person.class, "person"));} catch (SAXException | IOException e) {e.printStackTrace();}}}



本文完


参考博文:http://blog.csdn.net/zhutulang/article/details/37736407




0 0
原创粉丝点击