XML解析主要有三种方式,SAX、DOM、PULL。常规在PC上开发我们使用Dom相对轻松些,但一些性能敏感的数据库或手机上还是主要采用SAX方 式,SAX读取是单向的,优点:不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是很方便。而DOM方式会把整个XML文件加载到内存 中去,这里Android开发网提醒大家该方法在查找方面可以和XPath很好的结合如果数据量不是很大推荐使用,而PULL常常用在J2ME对于节点处 理比较好,类似SAX方式,同样很节省内存,在J2ME中我们经常使用的KXML库来解析。
DOM移动基本不用,所以我只把SAX,PULL做下笔记
要解析的XML文件
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book price="99.0" 出版日期="2008年">疯狂Java讲义</book>
<book price="89.0" 出版日期="2009年">轻量级Java EE企业应用实战</book>
<book price="69.0" 出版日期="2009年">疯狂Ajax讲义</book>
</books>
SAX方法
class MySaxHandler extends DefaultHandler {
private Map<String, String> map = null;// 存储单个解析的完整对象
private List<Map<String, String>> list = null;// 存储所有的解析对象
private String currentTag = null;// 正在解析的元素标签
private String currentValue = null;// 解析当前元素的值
private String nodeName = "book";
@Override
public void startDocument() throws SAXException {
Log.d("kk", "startDocument............");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
Log.d("kk", "startElement............"+"uri:"+uri+" localName:"+localName+" qName:"+qName);
if (attributes != null) {//标签的属性
for (int i = 0; i < attributes.getLength(); i++) {
if (attributes.getQName(i).equals("price")) {
sb.append("\n价格:");
sb.append(attributes.getValue(i));
System.out.println(attributes.getValue(i)+"........................");
}
if (attributes.getQName(i).equals("出版日期")) {
sb.append("\n出版日期:");
sb.append(attributes.getValue(i));
System.out.println(attributes.getValue(i)+".........///...............");
}
}
}
currentTag = qName;
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
Log.d("kk", "endDocument............");
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
sb.append("\n\n");
Log.d("kk", "endElement............"+"uri:"+uri+" localName:"+localName+" qName:"+qName);
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
Log.d("kk", "characters............");
if(currentTag!=null&¤tTag.equals(nodeName))
{
currentValue = new String(ch,start,length).trim();
sb.append("\n书名:");
sb.append(currentValue);
System.out.println(currentValue+"..........nn..............");
}
currentTag = null;
currentValue = null;
}
}
public void click2(View v) {
sb = new StringBuilder();
SAXParserFactory factory=SAXParserFactory.newInstance();//创建解析器
try {
XMLReader reader=factory.newSAXParser().getXMLReader();
reader.setContentHandler(new MySaxHandler());//为reader设置内容处理器
reader.parse(new InputSource(getResources().openRawResource(R.raw.books)));//开始解析文件
} catch (Exception e) {
e.printStackTrace();
}
textView.setText(sb.toString());
}
PULL方法
public void click1(View v) {
// 根据XML资源的ID获取解析该资源的解析器
// XmlResourceParser是XmlPullParser的子类
XmlResourceParser parser = getResources().getXml(R.xml.books);
sb = new StringBuilder();
// 还没有到文档的结尾处
try {
while (parser.getEventType() != XmlResourceParser.END_DOCUMENT) {
// 如果遇到开始标签
if (parser.getEventType() == XmlResourceParser.START_TAG) {
String tagName = parser.getName();
// 如果遇到book标签
if (tagName.equals("book")) {
String bookName = parser.getAttributeValue(null,
"price");
sb.append("价格:");
sb.append(bookName);
// 根据属性索引获取属性值
String bookPrice = parser.getAttributeValue(1);
sb.append("\n出版日期:");
sb.append(bookPrice);
sb.append("\n书名:");
sb.append(parser.nextText());
}
sb.append("\n\n");
}
// 获取解析器的下一个事件
parser.next();
}
textView.setText(sb.toString());
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}