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

来源:互联网 发布:农村淘宝在哪里取消 编辑:程序博客网 时间:2024/06/02 23:28

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 blocke.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;@Overridepublic void startDocument() throws SAXException {Log.d("print", "startDocument: " + "文档开始读取");}// 读取到开始标签,通过localName判断读取到了哪一个开始标签@Overridepublic 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));}}// 得到标签内携带的数据@Overridepublic 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);}}@Overridepublic 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;}@Overridepublic 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 blocke.printStackTrace();} catch (SAXException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}





0 0
原创粉丝点击