加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml解析方式

发布时间:2020-12-16 05:41:18 所属栏目:百科 来源:网络整理
导读:首先定义一个接口 [java] view plain copy package com.lei.xml; import java.io.InputStream; import java.util.List; public interface XMLParser{ //解析xml TListTxmlParse(InputStreamis); //构造xml TStringxmlSerializer(ListTlist); } 1. PULL解析

首先定义一个接口

[java] view plain copy
  1. packagecom.lei.xml;
  2. importjava.io.InputStream;
  3. importjava.util.List;
  4. publicinterfaceXMLParser{
  5. //解析xml
  6. <T>List<T>xmlParse(InputStreamis);
  7. //构造xml
  8. <T>StringxmlSerializer(List<T>list);
  9. }


1. PULL解析

解析速度快,事件处理,不会预加载整个文档

copy

importjava.io.IOException;
  • importjava.io.InputStream;
  • importjava.io.StringWriter;
  • importjava.util.ArrayList;
  • importjava.util.List;
  • importorg.xmlpull.v1.XmlPullParser;
  • importorg.xmlpull.v1.XmlPullParserException;
  • importorg.xmlpull.v1.XmlSerializer;
  • importandroid.util.Xml;
  • classPullParseimplementsXMLParser{
  • staticPullParsegetInstance(){
  • returnnewPullParse();
  • }
  • public<T>List<T>xmlParse(InputStreamis){
  • List<Book>list=null;
  • Bookbook=null;
  • XmlPullParserparser=Xml.newPullParser();
  • //XmlPullParserparser=
  • //XmlPullParserFactory.newInstance().newPullParser();
  • try{
  • parser.setInput(is,"utf-8");
  • inttype=parser.getEventType();
  • while(type!=XmlPullParser.END_DOCUMENT){//整个xml结束标签,出口
  • switch(type){
  • caseXmlPullParser.START_DOCUMENT://整个xml开始标签,入口
  • list=newArrayList<Book>();
  • break;
  • caseXmlPullParser.START_TAG://子开始标签
  • if(parser.getName().equals("book")){
  • book=newBook();
  • }elseif(parser.getName().equals("id")){
  • type=parser.next();
  • book.setId(Integer.parseInt(parser.getText()));
  • if(parser.getName().equals("name")){
  • book.setName(parser.getText());
  • }
  • break;
  • caseXmlPullParser.END_TAG://子结束标签
  • list.add(book);
  • catch(XmlPullParserExceptione){
  • e.printStackTrace();
  • catch(IOExceptione){
  • return(List<T>)list;
  • public<T>StringxmlSerializer(List<T>list){
  • List<Book>lists=(List<Book>)list;
  • XmlSerializerserializer=Xml.newSerializer();
  • serializer.startDocument("utf-8",true);
  • serializer.setOutput(newStringWriter());
  • serializer.startTag("","books");
  • for(Bookbook:lists){
  • serializer.startTag("","book");
  • serializer.attribute("","id",String.valueOf(book.getId()));
  • "name");
  • serializer.text(book.getName());
  • serializer.endTag("",248)"> serializer.endTag("",108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> serializer.endDocument();
  • }catch(IllegalArgumentExceptione){
  • e.printStackTrace();
  • catch(IllegalStateExceptione){
  • catch(IOExceptione){
  • returnserializer.toString();
  • }

  • 2. SAX解析

    树形结构,速度款,占用内存少,会预加载整个文档,适用于文档较小。

    copy

    importjava.util.ArrayList;
  • importjavax.xml.parsers.ParserConfigurationException;
  • importjavax.xml.parsers.SAXParser;
  • importjavax.xml.parsers.SAXParserFactory;
  • importorg.xml.sax.Attributes;
  • importorg.xml.sax.SAXException;
  • importorg.xml.sax.helpers.DefaultHandler;
  • importcom.lei.utils.Logs;
  • classSaxParseimplementsXMLParser{
  • staticSaxParsegetInstance(){
  • newSaxParse();
  • /**
  • *解析xml
  • */
  • try{
  • SAXParserparser=SAXParserFactory.newInstance().newSAXParser();
  • MyXmlHandlerhandler=newMyXmlHandler();
  • parser.parse(is,handler);
  • return(List<T>)handler.getBookList();
  • catch(ParserConfigurationExceptione){
  • catch(SAXExceptione){
  • *生成xml
  • public<T>StringxmlSerializer(List<T>list){
  • classMyXmlHandlerextendsDefaultHandler{
  • List<Book>list;
  • Bookbook;
  • StringBuilderbuilder;
  • publicList<Book>getBookList(){
  • returnlist;
  • //入口,开始
  • @Override
  • voidstartDocument()throwsSAXException{
  • super.startDocument();
  • Logs.v("startDocument");
  • list=newArrayList<Book>();
  • builder=newStringBuilder();
  • //出口,结束
  • @Override
  • voidendDocument()throwsSAXException{
  • super.endDocument();
  • Logs.v("endDocument");
  • //开始解析开始标签
  • voidstartElement(Stringuri,StringlocalName,StringqName,
  • Attributesattributes)super.startElement(uri,localName,qName,attributes);
  • Logs.v("startElement"+"uri"+uri+"localName"+localName
  • +"qName"+qName);
  • if("book".equals(localName)){
  • builder.setLength(0);//每次豆浆builder清空
  • //结束标签
  • voidendElement(Stringuri,StringqName)
  • super.endElement(uri,qName);
  • Logs.v("endElement"+"uri"+uri+"localName"+localName
  • if("id".equals(localName)){
  • book.setId(Integer.parseInt(builder.toString()));
  • if("name".equals(localName)){
  • book.setName(builder.toString());
  • //获取子标签的内容
  • voidcharacters(char[]ch,153); font-weight:bold; background-color:inherit">intstart,153); font-weight:bold; background-color:inherit">intlength)
  • super.characters(ch,start,length);
  • builder.append(ch,length);
  • Logs.v("characters"+newString(ch,length));
  • }

  • 3.DOM解析

    预先加载整个文档,占用内存大,不推荐使用

    copy

    importjavax.xml.parsers.DocumentBuilder;
  • importjavax.xml.parsers.DocumentBuilderFactory;
  • importorg.w3c.dom.Document;
  • importorg.w3c.dom.Element;
  • importorg.w3c.dom.Node;
  • importorg.w3c.dom.NodeList;
  • importorg.xml.sax.SAXException;
  • classDomParsestaticDomParsegetInstance(){
  • newDomParse();
  • public<T>List<T>xmlParse(InputStreamis){
  • List<Book>list= DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
  • DocumentBuilderbuilder=factory.newDocumentBuilder();
  • Documentdoc=builder.parse(is);
  • Elementelement=doc.getElementById("book");
  • NodeListnodeList=element.getChildNodes();
  • Bookbook=for(inti=0;i<nodeList.getLength();i++){
  • Nodenode=nodeList.item(i);
  • book=newBook();
  • NodeListdetails=node.getChildNodes();
  • intj=0;j<details.getLength();j++){
  • if(node.getLocalName().equals("id")){
  • book.setId(Integer.parseInt(node.getNodeValue()));
  • if(node.getLocalName().equals("name")){
  • book.setName(node.getNodeValue());
  • list.add(book);
  • return(List<T>)list;
  • 使用:

    在 assets下放了一个books.xml

    copy

    privatevoidparseXmBySax(){
  • InputStreamis=getAssets().open("books.xml");
  • newSaxParse().xmlParse(is);
  • for(Bookbook:list){
  • mShowTv.append(book.toString());
  • voidparseXmByPull(){
  • InputStreamis= is=getAssets().open("books.xml");
  • List<Book>list=PullParse.getInstance().xmlParse(is);
  • for(Bookbook:list){
  • mShowTv.append(book.toString());
  • voidparseXmlByDom(){
  • InputStreamis= is=getAssets().open("books.xml");
  • }
  • (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读