zoukankan      html  css  js  c++  java
  • android 之xml 解析

    方法一:我们使用pull

    第一步:需要解析的persons.xml

    <?xml version="1.0" encoding="UTF-8"?>  
    <persons>  
     <person id="23" grade="1">  
       <name>张三</name>  
       <age>30</age>   
      </person>   
      <person  grade="0" id="20">  
        <name>李四</name>  
         <age>25</age>  
      </person>  
    </persons> 

    第二步:编码关键Java代码

    /**
    	 * @param is 输入流
    	 * @return 人员集合
    	 * @throws Throwable
    	 */
    	public static List<Person> getPersons(InputStream is) throws Throwable {
    		List<Person> personList = new ArrayList<Person>();
    		Person person = null;
    		/** pull 解析工厂 */
    		XmlPullParserFactory pactory = XmlPullParserFactory.newInstance();
    		/** 过生工厂获取一个pull 解析器 */
    		XmlPullParser parser = pactory.newPullParser();
    		/**设定字符集编码*/
    		parser.setInput(is, "UTF-8");
    		/** 事件类型 
    		 *  读取到xml的声明返回数字0 START_DOCUMENT;
    		 *  读取到xml的结束返回数字1 END_DOCUMENT ; 
    		 *  读取到xml的开始标签返回数字2 START_TAG 
    		 *  读取到xml的结束标签返回数字3 END_TAG
    		 *  读取到xml的文本返回数字4 TEXT
    		 */
    		int event = parser.getEventType();
    
    		 System.out.println("XmlPullParser.END_DOCUMENT:"+XmlPullParser.END_DOCUMENT); //返回1
    		 System.out.println("XmlPullParser.START_DOCUMENT:"+ XmlPullParser.START_DOCUMENT);//返回1
    		 System.out.println("XmlPullParser.END_TAG:"+XmlPullParser.END_TAG); //返回3
    		while (event != XmlPullParser.END_DOCUMENT) {
    			String nodeName = parser.getName();
    			switch (event) {
    			case XmlPullParser.START_DOCUMENT:
    				break;
    			case XmlPullParser.START_TAG:
    				if ("person".equals(nodeName)) {
    					person = new Person();
    					person.setId(Integer.valueOf(parser.getAttributeValue(null,"id")));
    					person.setGrade(Integer.valueOf(parser.getAttributeValue(null,"grade")));
    				} else if ("name".equals(nodeName)) {
    					person.setName(parser.nextText());
    				} else if ("age".equals(nodeName)) {
    					person.setAge(Integer.valueOf(parser.nextText()));
    				}
    				break;
    			case XmlPullParser.END_TAG:
    				if ("person".equals(nodeName)) {
    					personList.add(person);
    				}
    				break;
    
    			default:
    				break;
    			}
    
    			event = parser.next();
    		}
    		return personList;
    	}

    pull  也可以解析文本内容。

    	parser.setInput(new StringReader("<?xml version=\"1.0\" encoding=\"UTF-8\"?><persons><person id=\"23\" grade=\"1\"><name>张三</name><age>30</age><image>zs</image></person><person  grade=\"0\" id=\"20\"><name>李四</name><age>25</age><image>ls</image> </person></persons> "));

    第三步:编写测试代码。并申请测试权限

    public class MyPullTest extends AndroidTestCase {
    
    
    	public void testPersonsPull(){
    		InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("persons.xml");
    		try {
    			List<Person> personList =  PullDemoActivity.getPersons(is);
    			for (Person p : personList) {
    				System.out.println(p.toString());
    			}
    		} catch (Throwable e) {
    			e.printStackTrace();
    		}
    	}
    }


    AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.hkrt.action"
          android:versionCode="1"
          android:versionName="1.0">
        <uses-sdk android:minSdkVersion="8" />
    
        <application android:icon="@drawable/icon" android:label="@string/app_name">
         <uses-library android:name="android.test.runner" />
            <activity android:name=".PullDemoActivity"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
       
        </application>
      <instrumentation android:name="android.test.InstrumentationTestRunner"
      android:targetPackage="com.hkrt.action" android:label="Tests for My App" />
      <uses-permission android:name="android.permission.INTERNET"/>
    </manifest>

    注:targetPackage="设到启动的Activity包下"


    结果图:


    方法二:我们使用SAX 解析。

    XMLContentHandler.java

    package com.hkrt.action;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    import com.hkrt.domain.Person;
    
    public class XMLContentHandler extends DefaultHandler {
    
    
    	private List<Person> persons = null;
    	private Person currentPerson;
    	private String tagName = null;//当前解析的元素标签
    
    	public List<Person> getPersons() {
    		return persons;
    	}
    	/*
    	 * 接收文档的开始的通知。
    	 */
    	@Override public void startDocument() throws SAXException {
    		persons = new ArrayList<Person>();
    	}
    	/*
    	 * 接收字符数据的通知。
    	 */
    	@Override public void characters(char[] ch, int start, int length) throws SAXException {
    		if(tagName!=null){
    			String data = new String(ch, start, length);
    			if(tagName.equals("name")){
    				this.currentPerson.setName(data);
    			}else if(tagName.equals("age")){
    				this.currentPerson.setAge(Short.parseShort(data));
    			}
    		}
    	}
    	/*
    	 * 接收元素开始的通知。
    	 * 参数意义如下:
    	 *    namespaceURI:元素的命名空间
    	 *    localName :元素的本地名称(不带前缀)
    	 *    qName :元素的限定名(带前缀)
    	 *    atts :元素的属性集合
    	 */
    	@Override public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
    		if(localName.equals("person")){
    			currentPerson = new Person();
    			currentPerson.setId(Integer.parseInt(atts.getValue("id")));
    			currentPerson.setGrade(Integer.parseInt(atts.getValue("grade")));
    		}
    		this.tagName = localName;
    	}
    	/*
    	 * 接收文档的结尾的通知。
    	 * 参数意义如下:
    	 *    uri :元素的命名空间
    	 *    localName :元素的本地名称(不带前缀)
    	 *    name :元素的限定名(带前缀)
    	 * 
    	 */
    	@Override public void endElement(String uri, String localName, String name) throws SAXException {
    		if(localName.equals("person")){
    			persons.add(currentPerson);
    			currentPerson = null;
    		}
    		this.tagName = null;
    	}
    }
    

    测试:

    public void testPersonsSax(){
    		InputStream inStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("persons.xml");
    		   try {
    				SAXParserFactory spf = SAXParserFactory.newInstance();
    				SAXParser saxParser = spf.newSAXParser(); //创建解析器
    				//设置解析器的相关特性,http://xml.org/sax/features/namespaces = true 表示开启命名空间特性  
    				//saxParser.setProperty("http://xml.org/sax/features/namespaces",true);
    				XMLContentHandler handler = new XMLContentHandler();
    				//File file = new File("解析内容");
    				//saxParser.parse(file, handler);
    				saxParser.parse(inStream, handler);
    				inStream.close();
    				List<Person> personList = handler.getPersons();
    				for (Person p : personList) {
    					System.out.println("sax解析:"+p.toString());
    				}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}

    结果图:


    在应用中,具体用那个,那一个更好。请查看具体的资料。在此不多做描述。总之能用pull 就用pull。

  • 相关阅读:
    使用 Spring data redis 结合 Spring cache 缓存数据配置
    Spring Web Flow 笔记
    Linux 定时实行一次任务命令
    css js 优化工具
    arch Failed to load module "intel"
    go 冒泡排序
    go (break goto continue)
    VirtualBox,Kernel driver not installed (rc=-1908)
    go运算符
    go iota
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218341.html
Copyright © 2011-2022 走看看