麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

Java XML SAX 解析注意

2019-11-14 21:15:32
字體:
來源:轉載
供稿:網友
java xml SAX 解析注意 什么時候可以把解析值賦給對象

一般從網上看到的sax解析,都是在Handler中的characters方法進行對象數據的賦值。示例代碼如下:

PRivate TransportFile parseXML(String xml) {SAXParserFactory saxfac = SAXParserFactory.newInstance();try {    SAXParser saxparser = saxfac.newSAXParser();    InputStream is = new ByteArrayInputStream(xml.getBytes());     MySAXHandler handler = new MySAXHandler();    saxparser.parse(is, handler);    return handler.getData();} catch (ParserConfigurationException e) {    e.printStackTrace();} catch (SAXException e) {    e.printStackTrace();} catch (FileNotFoundException e) {    e.printStackTrace();} catch (IOException e) {    e.printStackTrace();}return null;}private class MySAXHandler extends DefaultHandler{String currentTagName = "";TransportFile mData = null ;@Overridepublic void startElement(String uri, String localName, String qName,        Attributes attributes) throws SAXException {    currentTagName = qName ;    if("file".equals(qName)){        mData = new TransportFile();    }}@Overridepublic void characters(char[] ch, int start, int length)        throws SAXException {    String str = new String(ch,start,length);    if("guid".equals(currentTagName)){        mData.guid = str;    }else if("name".equals(currentTagName)){        mData.name = str;    }else if("type".equals(currentTagName)){        mData.type = str;    }else if("length".equals(currentTagName)){        mData.length = Long.parseLong(str);    }else if("index".equals(currentTagName)){        mData.index = Integer.parseInt(str);    }else if("count".equals(currentTagName)){        mData.count = Integer.parseInt(str);    }else if("data".equals(currentTagName)){        mData.data = Base64.decode(str);    }}@Overridepublic void endElement(String uri, String localName, String qName)        throws SAXException {    currentTagName = "";}public TransportFile getData(){    return mData ;}}

普通的使用場景中上述代碼沒有問題,但是當xml中某一標簽的內容很長時,就會引發上述代碼的bug。實踐發現sax解析每次也就解析1k左右的數據,超出部分其實是要分段多次解析的。所以問題來了,如果在characters方法中解析,那么其他幾段的數據仍然會不斷覆蓋最終返回對象中的數據,導致數據丟失。因此,對于賦值給最終傳回對象的數據,在characters階段只能不斷拼接,解析必須在endElement時才可以完成。否則當數據內容比較大的時候,網上代碼中的bug就會凸顯出來。順便貼上我的代碼:

    private class MySAXHandler extends DefaultHandler{        String currentTagName = "";        TransportFile mData = null ;        @Override        public void startElement(String uri, String localName, String qName,                Attributes attributes) throws SAXException {            currentTagName = qName ;            mStringBuilder = new StringBuilder();            if("file".equals(qName)){                mData = new TransportFile();            }        }        private StringBuilder mStringBuilder;        @Override        public void characters(char[] ch, int start, int length)                throws SAXException {            mStringBuilder.append(ch, start, length);        }            @Override        public void endElement(String uri, String localName, String qName)                throws SAXException {            String str = mStringBuilder.toString();            if("guid".equals(currentTagName)){                mData.guid = str;            }else if("name".equals(currentTagName)){                mData.name = str;            }else if("type".equals(currentTagName)){                mData.type = str;            }else if("length".equals(currentTagName)){                mData.length = Long.parseLong(str);            }else if("index".equals(currentTagName)){                mData.index = Integer.parseInt(str);            }else if("count".equals(currentTagName)){                mData.count = Integer.parseInt(str);            }else if("data".equals(currentTagName)){                mData.data = Base64.decode(str);            }            currentTagName = "";        }            public TransportFile getData(){            return mData ;        }    } 
characters方法參數注意

ch是當前解析到的字符數組,并不是精確的標簽內的內容。下面是解析第一個標簽時characters中 ch 、 start、length輸出:

===========characters ch: <?xml version='1.0' encoding='utf-8' standalone='yes' ?><file><guid>678c6f92-d617-40af-bb87-a80c3b2be91f</guid><name>0CAQLTZGO.jpg</name><type>image</type><length>71374</length><index>0</index><count>1</count><data>/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoK.....===========characters start:31===========characters length:36

真正當前需要的數據是ch數組從start開始的length個字符。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产日韩精品欧美一区视频 | 日本人乱人乱亲乱色视频观看 | 久色视频网站 | 精品中文一区 | 中文字幕在线看第二 | 国内精品久久久久久久久久久久 | 久久久日韩精品一区二区三区 | 国产成人在线播放视频 | 国产午夜电影 | 欧美性受ⅹ╳╳╳黑人a性爽 | 一边吃奶一边摸下娇喘 | 国产精品久久久久久久av三级 | 激情视频免费看 | 在线观看免费毛片视频 | 一级毛片在线免费观看视频 | 毛片免费观看视频 | 亚洲一区在线免费视频 | 日本黄色大片免费观看 | 九九热免费在线观看 | 黄在线看 | 久久一本日日摸夜夜添 | 成年人视频在线免费观看 | 国产精品一区二区三区在线播放 | 影视免费观看 | 久久久日韩精品一区二区 | 日本在线不卡一区二区 | 欧美精品久久久久久久久久 | 亚洲精品tv久久久久久久久久 | 特级黄一级播放 | 欧美四级在线观看 | 精品在线免费播放 | 91精品国产综合久久婷婷香 | 久久国产精品无码网站 | 久久毛片免费 | 啪啪激情 | 91久久久久久亚洲精品禁果 | 北原夏美av| 亚洲成人福利电影 | 一本大道av | 午夜看毛片| 欧美成人一区免费视频 |