• 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。

  • 相关阅读:
    【总结】——Repeater控件详细应用
    【SelfIntroduction in Optional Course】
    【软考之后的思考】
    打印菱形图案printDiamond
    【这是来自Word 2010 的Test】
    【30岁前挣够500万】
    【总结 CKEditor 和 CKFinder 的配置和使用】
    linux压缩(解压缩)命令详解 [转]
    关于吞吐量和并发度 [转]
    Linux的五个查找命令 [转]
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218341.html
Copyright © 2020-2023  润新知