日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android简化xml sax解析

發布時間:2024/4/15 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android简化xml sax解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  dom解析占用內存大(我這邊需要解析各種各樣的kml文件,有時4-5M的kml文件使用dom解析很多手機就內存溢出了),也需要引入第三方庫,所以使用相對于節省內存很多、不需引入其他庫的sax解析就是很好的選擇了。因為sax解析比較復雜的xml文件特別麻煩,所以整理了一個簡化android sax解析的工具。

  實現思路:和Android Touch事件傳遞機制一樣,把需要子解析器解析的節點往下傳遞。

  如果有進一步簡化的方法,歡迎交流!email:csqwyyx@163.com。

  示例程序:https://github.com/John-Chen/EasySaxParser

?

  簡化工具SaxParser:

public abstract class SaxParser {protected String curQName;protected StringBuilder curValue = new StringBuilder();protected SaxParser saxParser;protected String saxParserQName;/*** 需要生成子SaxParser的節點名稱*/protected HashSet<String> childParserQNames;public SaxParser() {}public SaxParser(HashSet<String> childParserQNames) {this.childParserQNames = childParserQNames;}protected void startElement(String uri, String localName, String qName, Attributes attributes) {if(qName == null){return;}if(saxParser != null){saxParser.startElement(uri, qName, qName, attributes);}else if(childParserQNames != null && childParserQNames.contains(qName)){this.saxParser = dispatchTo(qName, attributes);if(this.saxParser != null){this.saxParserQName = qName;saxParser.parserStart(attributes);}}else{curQName = qName;if(curValue.length() > 0){curValue.delete(0, curValue.length());}}}protected void endElement(String uri, String localName, String qName) {if(qName == null){return;}if(qName.equals(saxParserQName)){if(saxParser != null){saxParser.parserEnd();}saxParser = null;saxParserQName = null;}else if(saxParser != null){saxParser.endElement(uri, qName, qName);}else{parserElementEnd(qName, curValue.toString());curQName = null;if(curValue.length() > 0){curValue.delete(0, curValue.length());}}}protected void characters(char[] ch, int start, int length) {if(saxParser != null){saxParser.characters(ch, start, length);}else{String data = new String(ch, start, length);if(data.length() > 0 && curQName != null){curValue.append(data);}}}/*** 開始解析一個輸入流* @param is 文件輸入流* @param rootParserQName 解析的文件根節點* @param rootParser 根解析器*/public static void start(InputStream is,final String rootParserQName,final SaxParser rootParser){try {SAXParser parser = SAXParserFactory.newInstance().newSAXParser();parser.parse(is, new DefaultHandler(){@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {if(qName == null){return;}if(rootParser != null){rootParser.startElement(uri, qName, qName, attributes);}else if(qName.equals(rootParserQName)){rootParser.parserStart(attributes);}}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {if(rootParser != null){rootParser.characters(ch, start, length);}}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {if(qName == null){return;}if(qName.contains(rootParserQName)){if(rootParser != null){rootParser.parserEnd();}}else if(rootParser != null){rootParser.endElement(uri, qName, qName);}}});} catch (Exception e) {e.printStackTrace();}}/*** 節點解析開始*/public abstract void parserStart(Attributes attributes);/*** 一個子節點解析結束* @param value characters獲得的值*/public abstract void parserElementEnd(String qName, String value);/*** 解析事件需要向下傳遞,返回需要傳遞的子SaxParser*/public abstract SaxParser dispatchTo(String qName, Attributes attributes);/*** 節點解析結束*/public abstract void parserEnd();}

?

需要解析的xml文件test.xml:

<?xml version="1.0" encoding="UTF-8"?><kml xmlns:gx="http://www.google.com/kml/ext/2.2"><Document id="123"><description>abc</description><author>csq</author><ExtendedData><Data name="TrackId"><value>293156</value></Data><Data name="TrackTypeId"><value>8</value></Data></ExtendedData><Placemark><name>深圳灣公園</name><TimeStamp><when>2015-03-21T10:00:13Z</when></TimeStamp><Point><coordinates>113.93946,22.48955,9.0</coordinates></Point></Placemark></Document></kml>

   

開始解析:

根節點kml,根節點解析器KmlParser

SaxParser.start(getAssets().open("test.kml"), "kml", new Kml.KmlParser(kml));

?

部分節點解析實現:

public static class KmlParser extends SaxParser {private Kml kml;public KmlParser(Kml kml) {super(new HashSet<String>());this.kml = kml;childParserQNames.add("Document");}@Overridepublic void parserStart(Attributes attributes) {}@Overridepublic void parserElementEnd(String qName, String value) {}@Overridepublic SaxParser dispatchTo(String qName, Attributes attributes) {if(qName.equals("Document")){return new Document.DocumentParser(kml);}return null;}@Overridepublic void parserEnd() {}}

  

public static class DocumentParser extends SaxParser {private Kml kml;private Document document;public DocumentParser(Kml kml) {super(new HashSet<String>());this.kml = kml;childParserQNames.add("ExtendedData");childParserQNames.add("Placemark");}@Overridepublic void parserStart(Attributes attributes) {document = new Document();document.id = attributes.getValue("id");}@Overridepublic void parserElementEnd(String qName, String value) {if(document == null){return;}if(qName.equals("description")){document.description = value;}else if(qName.equals("author")){document.author = value;}}@Overridepublic SaxParser dispatchTo(String qName, Attributes attributes) {if(document == null){return null;}if(qName.equals("ExtendedData")){return new ExtendedData.ExtendedDataParser(document);}else if(qName.equals("Placemark")){return new Placemark.PlacemarkParser(document);}return null;}@Overridepublic void parserEnd() {kml.document = document;}}

  

public static class PlacemarkParser extends SaxParser {private Document document;private Placemark placemark;public PlacemarkParser(Document document) {super(new HashSet<String>(1));childParserQNames.add("Point");this.document = document;}@Overridepublic void parserStart(Attributes attributes) {placemark = new Placemark();}@Overridepublic void parserElementEnd(String qName, String value) {if(qName.equals("name")){placemark.name = value;}else if(qName.equals("when")){placemark.when = value;}}@Overridepublic SaxParser dispatchTo(String qName, Attributes attributes) {if(qName.equals("Point")){return new Point.PointParser(placemark);}return null;}@Overridepublic void parserEnd() {document.placemark = placemark;}}

  

public static class ExtendedDataParser extends SaxParser {private Document document;private ExtendedData extendedData;public ExtendedDataParser(Document document) {super(new HashSet<String>(1));childParserQNames.add("Data");this.document = document;}@Overridepublic void parserStart(Attributes attributes) {extendedData = new ExtendedData();}@Overridepublic void parserElementEnd(String qName, String value) {}@Overridepublic SaxParser dispatchTo(String qName, Attributes attributes) {if(qName.equals("Data")){return new Data.DataParser(extendedData);}return null;}@Overridepublic void parserEnd() {document.extendedDatas = extendedData;}}

  

......

?

解析結果:

?

  

?

轉載于:https://www.cnblogs.com/John-Chen/p/4644103.html

總結

以上是生活随笔為你收集整理的Android简化xml sax解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国内自拍第二页 | 日韩欧美日韩 | 爱爱高潮视频 | 亚洲自拍激情 | 免费一级做a爰片久久毛片潮 | 91丨porny丨露出 | 久久精品影视 | 色婷婷激情综合 | 国产福利一区二区三区视频 | 午夜黄色网 | 成人av综合| 黄a大片| 18av在线视频 | 黄色一级片视频 | 亚洲一区自拍偷拍 | 欧美在线不卡视频 | 欧美日韩高清一区 | 婷婷六月色 | 午夜毛片在线 | 国产麻豆一精品一男同 | 国产精品高潮呻吟久久久久久 | 美日韩久久| 最新日韩三级 | 亚色影库 | 中文字幕第6页 | 亚洲精品少妇久久久久久 | 国产精品老熟女视频一区二区 | 中文在线国产 | 亚洲综合色一区 | 姝姝窝人体www聚色窝 | 免费国偷自产拍精品视频 | 四虎4hu| 亚州av综合色区无码一区 | 日本东京热一区二区 | 欧美群妇大交乱 | 亚洲精品国偷拍自产在线观看蜜桃 | 91视频大全 | 神马午夜激情 | 亚洲欧洲日产av | 清冷学长被爆c躁到高潮失禁 | 毛片看看 | 四虎最新网址在线观看 | 久久久999精品| 五月激情丁香 | 性欧美精品男男 | 欧美一区三区三区高中清蜜桃 | 国产aⅴ爽av久久久久成人 | 在线视频观看国产 | 99re6在线 | 91国产在线播放 | 在线观看精品视频 | missav|免费高清av在线看 | 青青草社区 | 欧美日韩一 | 骚虎av在线| 永久免费未网 | 看片日韩 | 亚洲一卡二卡 | 国产精品理论在线观看 | 3d动漫精品啪啪一区二区竹菊 | 国产一区二区三区视频播放 | 在线看黄色av | 国产乱淫av麻豆国产 | 午夜精品久久久久久久久久 | 91久久免费 | 红桃视频国产 | 免费在线一级片 | 影音先锋二区 | 韩国成人免费视频 | 日韩城人视频 | 国内露脸中年夫妇交换 | 亲子乱aⅴ一区二区三区 | 欧美性xxxxxx| 在线观看国产亚洲 | 天天舔天天操天天干 | 奇米狠狠 | 黑人一级大毛片 | 草草浮力影院 | 国产伦精品一区二区三区高清版禁 | 男人都懂的网站 | 99国产在线播放 | 国产精品极品 | 永久av在线免费观看 | 日韩美女久久 | 无码人妻丰满熟妇精品区 | 国产一区二区三区在线看 | 国产精品男女视频 | 亚洲看 | av有声小说一区二区三区 | 在线观看日本网站 | 精品成在人线av无码免费看 | 麻豆午夜| 国产精品入口麻豆九色 | 深爱五月激情五月 | 欧美成人中文字幕 | 狠狠干2020| 开元在线观看视频国语 | 小视频黄色 | 成人免费在线视频观看 |