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