XML文件解析

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();
		}
	}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值