日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Java使用SAX解析xml的示例

瀏覽:139日期:2022-08-15 08:50:53
一、SAX解析xml簡介

SAX是Simple API for Xml的簡寫,主要功能是用于對xml文檔進(jìn)行解析。由于該方式采用的是事件驅(qū)動(dòng)(callback回調(diào)機(jī)制)解析方式,所以有速度快、占內(nèi)存少的優(yōu)點(diǎn),當(dāng)然這些優(yōu)點(diǎn)也僅限于xml的讀取操作,SAX是無法對讀取的XML元素進(jìn)行修改的。如果要修改節(jié)點(diǎn)元素則需要使用DOC方式進(jìn)行將xml文件讀取,它會(huì)將xml讀取成document樹結(jié)構(gòu)對象,這樣可用對節(jié)點(diǎn)元素進(jìn)行編輯操作;DOC方式的缺點(diǎn)也比較明顯:占內(nèi)存大、解析速度較慢。

所以僅用于讀取xml操作,使用SAX方式是比較好的方式。

二、SAX解析XML實(shí)例

創(chuàng)建一個(gè)解析的xml文件

<?xml version='1.0' encoding='utf-8'?><persons> <user> <userId>1001</userId> <userName>張三</userName> </user> <user> <userId>1002</userId> <userName>李四</userName> </user></persons>

創(chuàng)建一個(gè)XMLparseHandler用于自定義xml解析

public class Customhandler extends DefaultHandler2 { List<Map> list = new ArrayList<>(); Map map = null; String tag = ''; @Override public void startDocument() throws SAXException { System.out.println('開始解析xml'); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println('開始解析元素: <'+ qName + '>'); if(qName == 'user'){ map = new HashMap(); } tag = qName; } @Override public void characters(char[] ch, int start, int length) throws SAXException { String text = new String(ch, start, length).trim(); if(text != null && !text.isEmpty() && tag!=null&& tag!=''){ map.put(tag, text); if(!map.containsKey(tag)){ } System.out.println('解析到元素值:'+ text); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println('結(jié)束解析元素: <'+ qName + '>'); if(qName.equals('user')){ list.add(map); } tag = ''; } @Override public void endDocument() throws SAXException { System.out.println('結(jié)束解析xml'); }}

創(chuàng)建SAX解析對象解析xml

public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { //創(chuàng)建xml解析工廠 SAXParserFactory factory = SAXParserFactory.newInstance(); //創(chuàng)建xml解析對象 SAXParser parser = factory.newSAXParser(); File file = new File('test/custom/user.xml'); InputStream inputStream = new FileInputStream(file); Customhandler customhandler = new Customhandler(); //方式一 //parser.parse(inputStream, customhandler);//方式二 InputSource source = new InputSource(file.toURI().toURL().toString()); XMLReader xmlParser = parser.getXMLReader(); xmlParser.setContentHandler(customhandler); xmlParser.parse(source); List c = customhandler.list; inputStream.close();}//打印結(jié)果為:開始解析xml開始解析元素: <persons>開始解析元素: <user>開始解析元素: <userId>解析到元素值:1001結(jié)束解析元素: <userId>開始解析元素: <userName>解析到元素值:張三結(jié)束解析元素: <userName>結(jié)束解析元素: <user>開始解析元素: <user>開始解析元素: <userId>解析到元素值:1002結(jié)束解析元素: <userId>開始解析元素: <userName>解析到元素值:李四結(jié)束解析元素: <userName>結(jié)束解析元素: <user>結(jié)束解析元素: <persons>結(jié)束解析xml三、SAX的實(shí)際應(yīng)用

在tomcat源碼中,有一個(gè)Digester對象,這個(gè)Digester是tomcat啟動(dòng)時(shí),初始化各個(gè)容器(service、engine、Connetor)的執(zhí)行者,而Digester執(zhí)行容器初始化的依據(jù)是解析配置文件server.xml的內(nèi)容,根據(jù)xml的具體配置進(jìn)行來初始化容器。

下面是Digester的類的一些主要方法:

//org.apache.tomcat.util.digester.Digester#parse(org.xml.sax.InputSource)public class Digester extends DefaultHandler2 { //讀取解析xml public Object parse(InputSource input) throws IOException, SAXException { configure(); getXMLReader().parse(input); return root; } //對每個(gè)xml標(biāo)簽進(jìn)行解析,并執(zhí)行于之對應(yīng)的Rule規(guī)則列表 public void startElement(String namespaceURI, String localName, String qName, Attributes list) throws SAXException { boolean debug = log.isDebugEnabled(); // Parse system properties list = updateAttributes(list); // Save the body text accumulated for our surrounding element bodyTexts.push(bodyText); bodyText = new StringBuilder(); // the actual element name is either in localName or qName, depending // on whether the parser is namespace aware String name = localName; if ((name == null) || (name.length() < 1)) { name = qName; } // Compute the current matching rule StringBuilder sb = new StringBuilder(match); if (match.length() > 0) { sb.append(’/’); } sb.append(name); //根據(jù)每次xml節(jié)點(diǎn)的名稱拼接成匹配url match = sb.toString(); // Fire 'begin' events for all relevant rules(根據(jù)namespaceURI匹配獲取的Rule規(guī)則列表,有順序規(guī)則) List<Rule> rules = getRules().match(namespaceURI, match); matches.push(rules); if ((rules != null) && (rules.size() > 0)) { for (Rule value : rules) {try { Rule rule = value; if (debug) { log.debug(' Fire begin() for ' + rule); } //依次執(zhí)行begin方法 rule.begin(namespaceURI, name, list);} catch (Exception e) { log.error('Begin event threw exception', e); throw createSAXException(e);} catch (Error e) { log.error('Begin event threw error', e); throw e;} } } else { if (debug) {log.debug(' No rules found matching ’' + match + '’.'); } } }}

與之對應(yīng)的server.xml片段如下:

<Service name='Catalina'> <Connector port='8081' protocol='HTTP/1.1'connectionTimeout='20000'redirectPort='8443' /> <Engine name='Catalina' defaultHost='localhost'> <Host name='localhost' appBase='webapps'unpackWARs='true' autoDeploy='true'> </Host> </Engine></Service>

Digester讀取到上面這些xml標(biāo)簽后,就會(huì)從外向里進(jìn)行嵌套解析,將這些標(biāo)簽創(chuàng)建為與之對應(yīng)的java類實(shí)例,也就是tomcat的主體容器結(jié)構(gòu)。

以上就是Java使用SAX解析xml的示例的詳細(xì)內(nèi)容,更多關(guān)于Java使用SAX解析xml的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品nxnn| 免费不卡在线观看| 日韩激情一区二区| 日韩精品亚洲专区| 欧美伊人久久| 伊人久久大香伊蕉在人线观看热v| 国产91精品对白在线播放| 精品日韩视频| 日韩三区在线| 激情久久久久久久| 三级欧美韩日大片在线看| 色婷婷精品视频| 久久国产成人午夜av影院宅| 国内精品福利| 日本大胆欧美人术艺术动态| 中文一区一区三区免费在线观 | 中国女人久久久| 午夜国产精品视频免费体验区| 欧美女激情福利| 美美哒免费高清在线观看视频一区二区| 亚洲小说春色综合另类电影| 91国内精品| 成人午夜毛片| 日韩国产一区| 久久国产精品毛片| 亚洲九九精品| 中文字幕日韩欧美精品高清在线| 日韩高清在线观看一区二区| 国产精品一区二区三区av麻| 国产日韩欧美在线播放不卡| 国内精品伊人| 在线日韩av| 青草国产精品| 精品成人18| 在线成人直播| 亚洲少妇在线| 国产美女久久| 久久蜜桃精品| 亚洲精品影院在线观看| 欧美激情一区| 欧美日韩中文字幕一区二区三区| 久久国产高清| 久久香蕉精品香蕉| 久久精品电影| 亚洲精品四区| 亚洲一区二区小说| 精品在线网站观看| 欧美va天堂| 日韩高清在线一区| 欧美亚洲日本精品| 亚洲一区有码| 欧美在线日韩| 香蕉精品久久| 国产欧美另类| 不卡中文一二三区| 国产日韩欧美一区在线| 综合日韩av| 亚洲v天堂v手机在线| 韩国久久久久久| 欧美亚洲网站| 最新亚洲激情| 亚洲午夜久久久久久尤物| 亚洲精品免费观看| 麻豆视频在线观看免费网站黄 | 国产成人免费视频网站视频社区| 91久久中文| 国产精品久久久一区二区| 婷婷成人在线| 久久精品一区二区国产| 蜜桃久久久久| 日韩精品麻豆| 国产欧美三级| 欧美日韩视频一区二区三区| 免费一级欧美片在线观看网站 | 成人污污视频| 日韩一区精品字幕| 91麻豆国产自产在线观看亚洲| 蜜桃精品在线| 国产精品一区二区三区av麻| 私拍精品福利视频在线一区| 欧美日韩一区二区三区不卡视频 | 亚洲精品美女| 国产精品99一区二区| 国产精品毛片久久久| 亚洲欧美日韩高清在线| а√天堂8资源中文在线| 国产精品自在| 日韩精选在线| 日韩激情网站| 99精品视频在线观看免费播放| 欧美日韩1区2区3区| 美女精品在线观看| 日韩欧美综合| 国内精品99| 欧美日韩精品免费观看视完整| 欧美精品91| 欧美亚洲三级| 一区二区国产在线| 久久xxxx| 日韩不卡视频在线观看| 精品视频高潮| 国产欧美日韩免费观看| 日本中文字幕不卡| 亚洲在线观看| 国产综合精品一区| 伊人久久婷婷| 日韩理论视频| 国产+成+人+亚洲欧洲在线| 久久国产生活片100| 一区二区三区四区在线观看国产日韩| 欧美日韩在线观看视频小说| 电影亚洲精品噜噜在线观看| 国产一区二区三区不卡视频网站 | 午夜精品一区二区三区国产| а√天堂8资源中文在线| 精品一区二区三区免费看| 国产精品一区二区三区美女 | 亚洲人成在线网站| 国产福利电影在线播放| 国产精品不卡| 精品无人区麻豆乱码久久久| 国产精品久久久免费| 国产精品三p一区二区| 黄色欧美在线| 一区二区精品伦理...| 国产 日韩 欧美 综合 一区| 精品久久中文| 欧美激情日韩| 91亚洲精品在看在线观看高清| 中文字幕日韩欧美精品高清在线| 亚洲开心激情| 亚洲精品看片| 国产一区 二区| 美女视频网站久久| 精品日本视频| 欧美一级一区| 麻豆成人在线观看| 精品一区二区三区中文字幕在线| 四虎成人av| 精品日韩视频| 欧美女激情福利| 亚洲尤物在线| 在线精品国产亚洲| 青草国产精品| 日韩av在线播放网址| 欧美肉体xxxx裸体137大胆| 亚洲一区二区三区高清不卡| 亚洲一区黄色| 日本亚洲欧美天堂免费| 国产精品一区二区99| 精品日韩一区| 欧美亚洲精品在线| 日韩中文字幕亚洲一区二区va在线| 日日夜夜免费精品| 国产精品资源| 日韩欧美另类一区二区| 国产亚洲人成a在线v网站| 日本成人在线网站| 麻豆一区在线| 色吊丝一区二区| 丝袜a∨在线一区二区三区不卡| 日本亚洲欧美天堂免费| 精品午夜av| 偷拍欧美精品| 日韩福利视频网| 亚洲欧洲美洲av| 日韩精品一卡二卡三卡四卡无卡| 国产精品流白浆在线观看| 久久久久国产精品一区三寸| 久久九九精品| 亚洲毛片网站| 国产一区一一区高清不卡| 九色porny丨国产首页在线| 三级在线观看一区二区| 久久97久久97精品免视看秋霞| 免费久久精品| 国产精品视频一区视频二区| 亚洲大全视频| 国产精品日本一区二区三区在线 | 蜜桃久久久久久| 精品免费av| 日韩在线一区二区| 国产suv精品一区二区四区视频| 久久美女精品| 蜜臀国产一区| 午夜久久av | 亚洲一区欧美| 一区二区精品伦理...| 日本v片在线高清不卡在线观看| 日韩大片在线观看| 欧美午夜三级| 午夜视频精品| 国产66精品| 欧美日韩国产亚洲一区| 欧美在线综合| 99日韩精品| 国模大尺度视频一区二区| 自拍自偷一区二区三区| 国产精品日韩欧美一区| 久久在线91|