Xml解析的方式:
SAX解析、Pull解析和Dom解析,本文記錄的是SAX解析方法。
SAX解析原理:
它既是一個接口,也是一個軟體包.但作為接口,SAX是事件驅動型XML解析的一個标準接口,不會改變 SAX的工作原理,簡單地說就是對文檔進行順序掃描,當掃描到文檔(document)開始與結束、元素(element)開始與結束、文檔(document)結束等地方時通知事件處理函數,由事件處理函數做相應動作,然後繼續同樣的掃描,直至文檔結束。
優缺點:
優點:
- 解析速度快
- 占用記憶體小
缺點:
- 無法得知目前解析标簽(節點)的上層标簽,及嵌套結構。
- 隻能讀取Xml,不能修改Xml
- 無法随機通路某個節點
SAX解析步驟
- 得到xml檔案對應的資源檔案
- 得到SAX解析工廠(SAXParserFactory)
- 由解析工廠生産一個SAX解析器(SAXParser)
- 傳入輸入流和handler給解析器,調用parse()解析
SAX解析Demo:擷取解析的Map集合
Xml檔案内容:
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<PAY_CHANNEL></PAY_CHANNEL>
<ORD_DATE>564122</ORD_DATE>
<ORDER_ID>994585</ORDER_ID>
<OUTORDERID>123456785443547013</OUTORDERID>
<RSPMSG>小本買賣</RSPMSG>
<ORD_TIME>1000066</ORD_TIME>
<RSPCOD>444444</RSPCOD>
<ORD_NO>73545dgafdgd51156165s</ORD_NO>
<BUYERPAYAMOUNT>6.55</BUYERPAYAMOUNT>
</ROOT>
擷取Xml檔案内容
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
//加載assets中XML檔案
InputStream is = this.getResources().getAssets()
.open("test");
getXMLBySax(is);
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
}
SAX解析
/**
* SAX解析
* @param stream
* @throws SAXException
* @throws IOException
* @throws ParserConfigurationException
*/
public void getXMLBySax(InputStream stream) throws SAXException, IOException, ParserConfigurationException {
SAXParserFactory factory=SAXParserFactory.newInstance();//建立SAX解析工廠
javax.xml.parsers.SAXParser parser=factory.newSAXParser();//建立SAX解析器
SAXHandler handler=new SAXHandler();//建立處理函數
parser.parse(stream, handler);//開始解析
Map<String,String> map = handler.getXmlMap();//獲得解析的Map集合
}
SAXHandler處理器
public class SAXHandler extends DefaultHandler {
private String tag;// 目前解析的标簽
private Map<String,String> mMap = new HashMap<>();
public Map<String,String> getXmlMap() {
for (Map.Entry<String, String> entry : mMap.entrySet()) {
Log.e("tag","======== map " + entry.getKey() + " : " + entry.getValue());
}
return mMap;
}
@Override
public void startDocument() throws SAXException {
Log.e("tag","=== start");
}
@Override
public void endDocument() throws SAXException {
Log.e("tag","=== 文檔結束");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
tag = localName;
Log.e("tag","=== 節點開始");
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
tag = null;
Log.e("tag","=== 節點結束");
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//解析标簽内容
String data = new String(ch, start, length);
if (data != null&&tag!=null) {
if (tag.equals("ORD_DATE")) {
mMap.put("ORD_DATE",data);
} else if (tag.equals("ORDER_ID")) {
mMap.put("ORDER_ID",data);
} else if (tag.equals("OUTORDERID")){
mMap.put("OUTORDERID",data);
} else if (tag.equals("RSPMSG")){
mMap.put("RSPMSG",data);
} else if (tag.equals("ORD_TIME")){
mMap.put("ORD_TIME",data);
} else if (tag.equals("RSPCOD")){
mMap.put("RSPCOD",data);
} else if (tag.equals("ORD_NO")){
mMap.put("ORD_NO",data);
} else if (tag.equals("BUYERPAYAMOUNT")){
mMap.put("BUYERPAYAMOUNT",data);
}
}
}
運作效果:
E/tag: ======== map BUYERPAYAMOUNT : 6.55
E/tag: ======== map RSPMSG : 小本買賣
E/tag: ======== map ORDER_ID : 994585
E/tag: ======== map ORD_NO : 73545dgafdgd51156165s
E/tag: ======== map OUTORDERID : 123456785443547013
E/tag: ======== map ORD_TIME : 1000066
E/tag: ======== map RSPCOD : 444444
E/tag: ======== map ORD_DATE : 564122
參考:https://blog.csdn.net/ydxlt/article/details/50183693