日韩性视频-久久久蜜桃-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解析的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 亚洲涩涩视频 | 国产精品综合久久久久久 | 日本三级午夜理伦三级三 | 天天干天天操天天爱 | 污视频免费看 | 中文字幕一区二区三区人妻不卡 | 韩日午夜在线资源一区二区 | 亚洲va欧美va天堂v国产综合 | 老汉av | 桃花色综合影院 | 污污的视频在线观看 | 自拍99 | 新97超碰| 一个人看的毛片 | 亚洲久久色 | 亚洲熟妇无码一区二区三区导航 | 性久久久久久久久 | 免费欧美日韩 | 亚洲系列中文字幕 | 国产精品国产三级国产专区51 | 成人av在线网址 | 欧美色妞网 | 少妇扒开粉嫩小泬视频 | 成人精品一区二区三区中文字幕 | 欧美日韩国产一级片 | 激情久久一区 | 樱桃国产成人精品视频 | 国产成人久久77777精品 | 久草福利资源在线观看 | 天堂网在线视频 | 亚洲综合欧美日韩 | 久久亚洲精精品中文字幕早川悠里 | 国产欧美一区二区在线观看 | 成人在线免费看视频 | 天天综合网久久综合网 | 免费日韩欧美 | 亚洲精品99久久久久中文字幕 | 欧美三级在线视频 | 精品亚洲一区二区三区四区五区 | 视频国产一区 | 免费禁漫天堂a3d | 美女露出让男生揉的视频 | 亚洲人妻一区二区三区 | 日本中文字幕在线视频 | 欧美日韩国内 | 哺乳期av | 丝袜视频在线 | 一区二区三区在线播放 | 蜜臀一区| 中文字幕一区二区三区免费看 | 凹凸福利视频 | 久久精品黄色 | 插插影视 | 在线观看网页视频 | 亚洲天堂2013 | 在线天堂v | 日本高清免费不卡视频 | 国产尤物在线 | 黑人巨大精品欧美一区二区 | 国产99久久九九精品无码 | 色七七在线 | 草草影院网址 | 欧美极品视频在线观看 | 在线观看日本一区二区 | 东京热无码av一区二区 | 成人午夜精品福利 | 国产一二三在线 | 天天操天天曰 | 三级性视频 | 国产91黄色 | 中文字幕日韩亚洲 | 深爱综合网 | 你懂的网址在线 | 黄色片视频网站 | 黄色一级播放 | 精品久久久久久久久久久 | 国产福利免费 | 天堂无乱码 | 永久av免费在线观看 | 91视频最新入口 | 99久久精品无码一区二区毛片 | 亚洲成人一区在线观看 | 色偷偷人人澡人人爽人人模 | 亚洲爱爱av| 网址你懂的在线 | 天堂精品久久 | av影院在线| 亚洲激情图片 | 网站久久久 | 亚洲天堂手机在线观看 | 夜夜涩| 亚州国产精品 | 日韩网站在线播放 | 国产淫视 | 国产又粗又长又大视频 | 国产高清在线 | 日韩国产欧美一区二区 | 国产草草草 | 精品伊人久久 |