Android网络编程之解析XML格式数据
XML(Extensible Markup Language) 即可扩展标记语言,其和HTML类似,但又和HTML有很多不同之处。
**
- XML简化数据分享
- XML简化数据传输
- XML简化平台的变更
- XML使数据更有用
- XML可用于创建新的Internet语言
- XML最大的特点是标签没有被预定义,需要自定义标签,不像HTML那样必须使用固定的预定义元素集。
**
SAX(Simple API for XML)是基于事件驱动的,边加载边解析。在用SAX解析XML文档的时候,在读取到文档开始和结束标签的时候会回调一个事件,在读取到其他节点与内容的时候也会回调一个事件。
以下为代码示例:
public class MainActivity extends Activity {
TextView textView ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content_main);
textView = (TextView) findViewById(R.id.textView);
//调用解析XML数据的方法
ParserXMLwithSAX();
}
private void ParserXMLwithSAX(){
//XML数据
String XML_DATA="<root>" +
" <Book>" +
" <name>《老人与海》</name>" +
" <author>海明威</author>" +
" <price>26.5</price>" +
" </Book>" +
"</root>";
//读取XML数据到输入流中
InputStream stream = new ByteArrayInputStream(XML_DATA.getBytes());
//
InputSource source = new InputSource(stream);
try {
//实例化SAXParserFactory 对象
SAXParserFactory factory = SAXParserFactory.newInstance();
//实例化一个解析器对象SAXParser
SAXParser parser = factory.newSAXParser();
//获取事件源对象XMLReader
XMLReader reader = parser.getXMLReader();
//创建一个ContentHandler对象,此类的具体定义在下一个代码块
ContentHandler handler = new ContentHandler();
//解析器注册事件
reader.setContentHandler(handler);
//解析数据
reader.parse(source);
textView.setText(handler.getData());
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class ContentHandler extends DefaultHandler {
String name ; //存放书名
String author ; //存放作者
String price ; //存放价格
String currentTag ; //获得当前标签
//在开始XML解析的时候调用
@Override
public void startDocument() throws SAXException {
super.startDocument();
}
//完成整个XML解析的时候调用
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
//开始解析某个节点的时候调用
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
//获取到当前标签
currentTag = qName;
}
//完成解析某个节点的时候调用
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
//完成某个节点解析后将当前标签字符串设置为null
currentTag = null;
}
//获取节点中的内容的时候调用
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
//判断正在解析哪个节点,然后获取当前节点的数据
if ("name".equals(currentTag)) {
name = "书名: " + new String(ch, start, length)+ " ";
}
if ("author".equals(currentTag)) {
author = "作者: " + new String(ch, start, length)+ " ";
}
if ("price".equals(currentTag)) {
price = "价格: " + new String(ch, start, length);
}
}
public String getData() {
//将解析出来的数据返回给MainActivity后用TextView显示出来
return name + author + price;
}
}
结果如图:
PULL解析XML的方式与SAX解析XML的方式一样,它也是基于事件驱动的。
代码示例如下:
public class MainActivity extends Activity {
TextView textView ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content_main);
textView = (TextView) findViewById(R.id.textView);
//调用解析XML的方法
ParserXMLwithPULL();
}
private void ParserXMLwithPULL(){
//XML数据
String XML_DATA="<root>" +
" <Book>" +
" <name>《老人与海》</name>" +
" <author>海明威</author>" +
" <price>26.5</price>" +
" </Book>" +
"</root>";
try {
String name = "";
String author = "";
String price = "";
//实例化XmlPullParserFactory对象
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
//将XML数据读入XmlPullParser解析器中
parser.setInput(new StringReader(XML_DATA));
//定义PULL解析常用事件类型
int eventType = parser.getEventType();
//判断是否为数据的逻辑末尾,输入流的末尾
while (eventType != XmlPullParser.END_DOCUMENT) {
//获得节点的标签名称
String nodeName = parser.getName();
switch (eventType) {
//开始解析某个节点
case XmlPullParser.START_TAG: {
if ("name".equals(nodeName)) {
name = parser.nextText();
} else if ("author".equals(nodeName)) {
author = parser.nextText();
} else if ("price".equals(nodeName)) {
price = parser.nextText();
}
}
break;
}
eventType = parser.next();
}
textView.setText("书名: "+name + " 作者:"+author + " 价格:"+ price);
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}