XML三种解析方式:
解析方式 | 特点 | 适用场景 |
---|---|---|
DOM | 消耗内存,可以修改文档 | 小文档频繁访问,需要修改文档 |
PULL | “拉”方式解析,取到数据后可以马上结束,不用完全解析文档 | 按需解析,尤其适用于数据在前中部分的文档 |
SAX | 大文档完全解析效率高,必须完全解析文档 | 大文档完整解析或数据在xml文档末尾 |
下面简单说明下三种解析方式的使用
XML文件
新建xml文件food.xml
<?xml version="1.0" encoding="utf-8"?>
<food>
<fruit id="1">
<apple>
<name>红苹果</name>
<color>红色</color>
</apple>
<apple>
<name>绿苹果</name>
<color>绿色</color>
</apple>
</fruit>
<fruit id="2">
<name>橘子</name>
<color>橘色</color>
</fruit>
<fruit id="3">
<name>香蕉</name>
<color>黄色</color>
</fruit>
</food>
三种解析方式
DOM 解析
InputStream inputStream = getAssets().open("food.xml");
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = builder.parse(inputStream);
Element root = document.getDocumentElement();
NodeList fruitList = root.getElementsByTagName("fruit");
NodeList list = fruitList.item(2).getChildNodes();
for (int i = 0 ; i < list.getLength() ; i++) {
if (list.item(i).getNodeType() == Node.ELEMENT_NODE) {
print(list.item(i).getFirstChild().getNodeValue());
}
}
DOM 解析书写简便,但感觉不如下面两种解析方式好理解
SAX 解析
- 重写用于Sax解析的Handler,解析后处理逻辑写到这里
public class SaxHandler extends DefaultHandler {
/**
* 当SAX解析器解析开始解析文档
*/
@Override
public void startDocument() throws SAXException{
}
/**
* 当SAX解析器解析开始某个元素
*/
@Override
public void startElement(String uri,String localName,String qName,
Attributes attributes) throws SAXException{
}
/**
* 当SAX解析器解析到某个元素的属性值,参数ch记录了这个属性值的内容
*/
@Override
public void characters(char[] ch,int start,int length) throws SAXException{
}
/**
* 当SAX解析器解析解析某个元素结束
*/
@Override
public void endElement(String uri,String localName,String qName)
throws SAXException{
}
/**
* 当SAX解析器解析结束解析文档
*/
@Override
public void endDocument() throws SAXException {
}
}
- Java代码实现
InputStream inputStream = getAssets().open("food.xml");
InputSource inputSource = new InputSource(inputStream);
XMLReader reader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
SaxHandler saxHandler = new SaxHandler();
//设置解析Handler
reader.setContentHandler(saxHandler);
//开始解析
reader.parse(inputSource);
PULL 解析
InputStream inputStream = getAssets().open("food.xml");
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setInput(inputStream, "utf-8");
int eventType = parser.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT){
switch(eventType){
case XmlPullParser.START_DOCUMENT:
//文档开始
break;
case XmlPullParser.START_TAG:
//标签开始
if (parser.getName().equals("name")) {
print(parser.nextText()); //打印属性值
}
break;
case XmlPullParser.END_TAG:
//标签结束
break;
default:
break;
}
//继续解析
eventType = parser.next();
}
当取得需要的值后,可以随时退出循环停止解析