温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Android——xml文件的解析

发布时间:2020-06-08 18:35:09 来源:网络 阅读:418 作者:wauoen 栏目:移动开发

解析方法:DOM、SAX、PULL

  1. DOM:将xml转化为树进行遍历

public void DOMParser() {
    try {
      // 1.创建DocumentBuilder实例
      DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
       // 2.创建Document实例
	Document doc = builder.parse(file);
	// 3.获取xml文件的根节点(persons)
	Element element = doc.getDocumentElement();
	// 4.获取根节点的子节点列表(person的列表)
	NodeList personList = element.getElementsByTagName("person");// TODO
	// NodeList personList = element.getChildNodes();//这个方法不行
	// 5. 遍历所有的person节点
	for (int i = 0; i < personList.getLength(); i++) {
	// 6.获取单个person节点
	Element person = (Element) personList.item(i);
	// 7.读取person的属性
	String id = person.getAttribute("id");
	System.out.println("person   id: " + id);
	// 8.获取person的子节点列表
	NodeList childList = person.getChildNodes();
	// 9.遍历person子节点
	for (int j = 0; j < childList.getLength(); j++) {
	        // 10.访问子节点
		Node child = (Node) childList.item(j);
		if (child.getNodeType() == Node.ELEMENT_NODE) {// 如果子节点是一个元素节点
		// 11.获取元素名称
		String name = child.getNodeName();
		if ("name".equals(name)) {// 获取person name
			System.out.println("名字: "
		        + child.getFirstChild().getNodeValue());
		} else if ("age".equals(name)) {// 获取person age
			System.out.println("年龄:"
		        + child.getFirstChild().getNodeValue());
						}
					}
				}
			}
		} 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();
		}

	}

2.SAX:从上往下挨个遍历标签

// 1.创建一个Handler类,继承DefaultHandler
	class SaxHandler extends DefaultHandler {

		/** 上一个节点名称 */
		private String tag;

		// 需要重写五个方法:
		// 1.startDocument():开始文档时做预处理
		// 2.endDocument():结束文档时做善后处理
		// 3.startElement():遇到开始标签是调用该方法
		// 4.endElement():遇到结束标签时调用该方法
		// 5.characters():内容

		public void startDocument() throws SAXException {
			System.out.println("调用startDocument()方法");
		}

		public void endDocument() throws SAXException {
			System.out.println("调用endDocument()方法");
		}

		// 在该方法中读取标签的属性
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			System.out.println("调用startElement()方法"+"localName:"+localName+"qName:"+qName);
			if ("person".equals(qName)) {
				System.out.println("person:       ");
				System.out.println("     id: " + attributes.getValue("id"));
			}
			tag = qName;
		}

		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			System.out.println("调用endElement()方法");
		}

		// 读取标签内容
		// 每次都开始结束标签时都调用
		public void characters(char[] ch, int start, int length)
				throws SAXException {

			System.out.println("调用characters()方法");

			String data = new String(ch, start, length);
			if ("name".equals(tag)) {
				System.out.println("name: " + data);
			} else if ("age".equals(tag)) {
				System.out.println("age: " + data);
			}
		}
	}

	// 2.sax 解析
	public void SAXParser() {
		try {
			//2.1创建解析器
			javax.xml.parsers.SAXParser parser = SAXParserFactory.newInstance()
					.newSAXParser();
			//2.2创建处理器
			SaxHandler handler = new SaxHandler();
			//2.3创建文件输入流
			FileInputStream fis = new FileInputStream(file);
			//2.4解析文件
			parser.parse(file, handler);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 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();
		}
	}

3.Pull:与SAX类似,在android开发中应用较多

public static void xmlPullParser(InputStream is) {

		try {
			// 1.获取输入流
			// 2.获取解析器
			XmlPullParser parser = Xml.newPullParser();
			parser.setInput(is, "utf-8");
			// 3.获取事件类型
			int eventType = parser.getEventType();
			// 4.遍历节点
			while(eventType != XmlPullParser.END_DOCUMENT){
				switch (eventType) {
				case XmlPullParser.START_DOCUMENT://文件开启
					break;
				case XmlPullParser.START_TAG://标签开始
					//4.1获取节点名称
					String name = parser.getName();
					if(name.equals("person")){
						//4.2 获取节点属性值
						String id = parser.getAttributeValue(0);
					}else if(name.equals("name")){
						//4.3 获取下个文本值
						System.out.println("name: "+ parser.nextText());
					}else if(name.equals("age")){
						System.out.println("age: "+ parser.nextText());
					}
					break;
				case XmlPullParser.END_TAG://标签结束
					
					break;

				default:
					break;
				}
				
				eventType = parser.next();
			}
			
			is.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (XmlPullParserException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI