XML解析之PULL解析+SAX解析+DOM解析

1.PULL解析

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
			// 获取XmlPullParser实例
			pullParser = factory.newPullParser();
public List<News> pull(XmlPullParser pullParser, InputStream inStream) {
		News news = null;
		List<News> lists = null;
		try {
			// 设置解析内容
			pullParser.setInput(inStream, "UTF-8");
			// 开始
			int eventType = pullParser.getEventType();

			while (eventType != XmlPullParser.END_DOCUMENT) {
				String nodeName = pullParser.getName();
				switch (eventType) {
				// 文档开始
				case XmlPullParser.START_DOCUMENT:
					lists = new ArrayList<News>();
					break;
				// 开始节点
				case XmlPullParser.START_TAG:
					if ("news".equals(nodeName)) {
						news = new News();
					} else if ("id".equals(nodeName)) {
						news.setId(Integer.parseInt(pullParser.nextText()));
					} else if ("title".equals(nodeName)) {
						news.setTitle(pullParser.nextText());
					} else if ("body".equals(nodeName)) {
						news.setBody(pullParser.nextText());
					} else if ("commentCount".equals(nodeName)) {
						news.setCommentCount(Integer.parseInt(pullParser
								.nextText()));
					} else if ("author".equals(nodeName)) {
						news.setAuthor(pullParser.nextText());
					} else if ("authorid".equals(nodeName)) {
						news.setAuthorid(Integer.parseInt(pullParser.nextText()));
					} else if ("pubDate".equals(nodeName)) {
						news.setPubDate(pullParser.nextText());
					} else if ("url".equals(nodeName)) {
						news.setUrl(pullParser.nextText());
					}
					break;
				// 结束节点
				case XmlPullParser.END_TAG:
					if ("news".equals(nodeName)) {
						lists.add(news);
						news = null;
					}
					break;
				default:
					break;
				}
				// 手动的触发下一个事件
				eventType = pullParser.next();
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return lists;
	}

2.SAX解析

// 获取SAX解析的工厂类
		SAXParserFactory instance = SAXParserFactory.newInstance();
private void initData(SAXParserFactory instance) {
		try {
			// 获取SAX解析的解析类
			SAXParser newSAXParser = instance.newSAXParser();
			// 获取Xml读取类
			XMLReader xmlReader = newSAXParser.getXMLReader();

			xmlReader.setContentHandler(new DefaultHandler() {
				// 定义全局变量,记录每次读取到的标签的名字
				String temp;
				City city;

				@Override
				public void startDocument() throws SAXException {
					Log.d("print", "startDocument: " + "文档开始读取");
				}

				// 读取到开始标签,通过localName判断读取到了哪一个开始标签
				@Override
				public void startElement(String uri, String localName,
						String qName, Attributes attributes)
						throws SAXException {
					temp = localName;
					Log.d("print", "start: temp" + temp);
					// 判断是不是开始标签
					if ("city".equals(temp)) {
						// 实例化要封装的对象
						city = new City();
						// 获取值,将值封装入对象
						String id = attributes.getValue("id");
						city.setId(Integer.parseInt(id));
					}
				}

				// 得到标签内携带的数据
				@Override
				public void characters(char[] ch, int start, int length)
						throws SAXException {
					// 将字符数组转换成为字符串
					String str = new String(ch, start, length);
					Log.d("print", "characters  :" + str);

					if ("name".equals(temp)) {
						city.setName(str);
					} else if ("type".equals(temp)) {
						city.setType(str);
					} else if ("address".equals(temp)) {
						city.setAddress(str);
					}
				}

				@Override
				public void endElement(String uri, String localName,
						String qName) throws SAXException {
					temp = localName;
					Log.d("print", "end temp :" + temp);
					if ("city".equals(temp)) {
						// 添加到集合
						data.add(city);
						// 对象置空
						city = null;
					}
					// 清空记录变量的标签
					temp = null;
				}

				@Override
				public void endDocument() throws SAXException {
					Log.d("print", "endDocument:" + "文档读取完毕");
				}

			});
			// 设置要读取的源文件
			xmlReader.parse(new InputSource(getAssets().open("city.xml")));

		} catch (Exception e) {
			e.printStackTrace();
			Log.d("print", "异常了:");
		}
	}

3.DOM解析

// 得到DOM解析的工厂类
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory
				.newInstance();
		try {
			// 得到DOM方式的解析类
			DocumentBuilder documentbuilder = builderFactory
					.newDocumentBuilder();
			// 通过输入流设置要解析的xml文件,得到Document(文本对象),包含当前xml的信息
			Document document = documentbuilder.parse(getAssets().open("data.xml"));
			// 获得根元素 (根节点)<persons>
			Element documentElement = document.getDocumentElement();
			// 得到根元素下所有的子节点
			NodeList childNodes = documentElement.getChildNodes();
			// 遍历出根元素下所有的子节点
			for (int i = 0; i < childNodes.getLength(); i++) {
				// 每一个子节点下的数据,都封装成一个对象
				Person p = new Person();
				// 按角标取得相对应的子节点
				Node node = childNodes.item(i);
				// 判断节点是不是元素
				if (node.getNodeType() == Node.ELEMENT_NODE) {
					// 把子节点转换成为元素
					Element element = (Element) node;
					// 得到当前元素的属性节点
					String id = element.getAttribute("id");
					p.setId(Integer.parseInt(id));
					// 得到<person>节点的所有子节点 <name>lee</name>和 <age>30</age>
					NodeList childNodes2 = element.getChildNodes();

					for (int j = 0; j < childNodes2.getLength(); j++) {
						// j=0时,得到 <name>lee</name>,j=1时,得到 <age>30</age>
						Node item = childNodes2.item(j);
						// 判断节点是不是元素点
						if (item.getNodeType() == Node.ELEMENT_NODE) {
							// 把节点转换成为元素
							Element element2 = (Element) item;
							// 得到标签所包含的文本
							String value = element2.getFirstChild()
									.getNodeValue();
							// 如果标签是<name>,取出标签的文本内容,封装到person对象里
							if ("name".equals(element2.getNodeName())) {
								p.setName(value);
							} else if ("age".equals(element2.getNodeName())) {
								p.setAge(Integer.parseInt(value));
							}
						}
					}
					Log.d("print", p.toString());
					// 把封装的信息存入集合中
					data.add(p);

				}

			}
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException 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、付费专栏及课程。

余额充值