Android中Junit測試、XML的序列化與解析

Android中Junit測試、XML的序列化與解析


一、關(guān)于Junit測試

首先需要在manifest.xml中配置,在manifest節(jié)點(diǎn)下指定以下信息其中targetPacketage是你想要測試的項目的包名

   <!--     指定測試信息和要測試的包 -->
    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.itheima28.junittest" >
    </instrumentation>

application節(jié)點(diǎn)下加入

  <!--         指定引用的測試包 -->
   <uses-library android:name="android.test.runner" />

使用時直接繼承AndroidTestCase即可

public class TestCase extends AndroidTestCase {

    public void test() {
            。。。。
       }
}

二、使用XmlSerializer類序列化XML

XmlSerializer主要是以數(shù)據(jù)流的形式序列化XML而它是一個接口無法直接實(shí)例化,需要通過一個靜態(tài)方法Xml.newSerializer獲取對象

下面是一些常用的方法

  • startDocument(String,boolean):第一個參數(shù)設(shè)置文檔的編碼格式,第二個參數(shù)設(shè)置是否是一個獨(dú)立的文檔,一般設(shè)置為true。
  • endDocument():標(biāo)記XML文檔的結(jié)束,XML文檔標(biāo)簽均為成對出現(xiàn),有始有終。
  • startTag(String,String):一個XML標(biāo)簽的開始,第一個參數(shù)為命名空間,一般為null即可,第二個參數(shù)為標(biāo)簽名。
  • endTag(String,String):一個XML標(biāo)簽的結(jié)束,第一個參數(shù)為命名空間,一般為null即可,第二個參數(shù)為標(biāo)簽名,有始有終。
  • attribute(String,String,String):設(shè)置一個標(biāo)簽的屬性,第一個參數(shù)為命名空間,第二個參數(shù)是屬性名,第三個參數(shù)為屬性值。
  • text(String/...):設(shè)置標(biāo)簽的值

下面是一個實(shí)例

public class TestCase extends AndroidTestCase {

    public void test() {
//      writeXmlToLocal();
        
        List<Person> personList = parserXmlFromLocal();
        
        for (Person person : personList) {
            Log.i("TestCase", person.toString());
        }
    }
    
    /**
     * 寫xml文件到本地
     */
    private void writeXmlToLocal() {
        List<Person> personList = getPersonList();
        
        // 獲得序列化對象
        XmlSerializer serializer = Xml.newSerializer();
        
        try {
            File path = new File(Environment.getExternalStorageDirectory(), "persons.xml");
            FileOutputStream fos = new FileOutputStream(path);
            // 指定序列化對象輸出的位置和編碼
            serializer.setOutput(fos, "utf-8");
            
            serializer.startDocument("utf-8", true);    // 寫開始 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
            
            serializer.startTag(null, "persons");       // <persons>
            
            for (Person person : personList) {
                // 開始寫人

                serializer.startTag(null, "person");    // <person>
                serializer.attribute(null, "id", String.valueOf(person.getId()));
                
                // 寫名字
                serializer.startTag(null, "name");      // <name>
                serializer.text(person.getName());
                serializer.endTag(null, "name");        // </name>
                
                // 寫年齡
                serializer.startTag(null, "age");       // <age>
                serializer.text(String.valueOf(person.getAge()));
                serializer.endTag(null, "age");     // </age>
                
                serializer.endTag(null, "person");  // </person>
            }
            
            serializer.endTag(null, "persons");         // </persons>
            
            serializer.endDocument();       // 結(jié)束
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
    
    private List<Person> getPersonList() {
        List<Person> personList = new ArrayList<Person>();
        
        for (int i = 0; i < 30; i++) {
            personList.add(new Person(i, "wang" + i, 18 + i));
        }
        
        return personList;
    }
    
    
}

三、使用pull解析XML

PULL解析器的運(yùn)行方式和SAX解析器很相似,都是事件觸發(fā)機(jī)制。如開始元素和結(jié)束元素,使用parser.next()可以進(jìn)行下一個元素并觸發(fā)相應(yīng)的事件,事件作為代碼被發(fā)送,返回值是數(shù)字,因此可以用一個switch語句來對事件進(jìn)行選擇,然后進(jìn)行相應(yīng)的處理,當(dāng)開始解析元素的時候,調(diào)用parser.nextText()方法可以獲得下一個Text類型的元素。

常用屬性

  • START_DOCUMENT
  • START_TAG
  • TEXT
  • END_TAG
  • END_DOCUMENT
private List<Person> parserXmlFromLocal() {
        try {
            File path = new File(Environment.getExternalStorageDirectory(), "persons.xml");
            FileInputStream fis = new FileInputStream(path);
            
            // 獲得pull解析器對象
            XmlPullParser parser = Xml.newPullParser();
            // 指定解析的文件和編碼格式
            parser.setInput(fis, "utf-8");
            
            int eventType = parser.getEventType();      // 獲得事件類型
            
            List<Person> personList = null;
            Person person = null;
            String id;
            while(eventType != XmlPullParser.END_DOCUMENT) {
                String tagName = parser.getName();  // 獲得當(dāng)前節(jié)點(diǎn)的名稱
                
                switch (eventType) {
                case XmlPullParser.START_TAG: // 當(dāng)前等于開始節(jié)點(diǎn)  <person>
                    if("persons".equals(tagName)) { // <persons>
                        personList = new ArrayList<Person>();
                    } else if("person".equals(tagName)) { // <person id="1">
                        person = new Person();
                        id = parser.getAttributeValue(null, "id");
                        person.setId(Integer.valueOf(id));
                    } else if("name".equals(tagName)) { // <name>
                        person.setName(parser.nextText());
                    } else if("age".equals(tagName)) { // <age>
                        person.setAge(Integer.parseInt(parser.nextText()));
                    }
                    break;
                case XmlPullParser.END_TAG:     // </persons>
                    if("person".equals(tagName)) {
                        // 需要把上面設(shè)置好值的person對象添加到集合中
                        personList.add(person);
                    }
                    break;
                default:
                    break;
                }
                
                eventType = parser.next();      // 獲得下一個事件類型
            }
            return personList;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 1 XML解析No29 【 XML:可拓展標(biāo)記語言,語言和HTML類似,也是一種標(biāo)記語言。 特點(diǎn):標(biāo)記是自定義...
    征程_Journey閱讀 1,789評論 0 9
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,692評論 18 399
  • 一、緒論 上周工作需要了解項目的一些大體內(nèi)容,結(jié)果在xml解析這一塊看的迷迷糊糊的,所以在這里把學(xué)習(xí)到xm...
    cao健強(qiáng)閱讀 4,539評論 1 7
  • C1 C1 大獎賽落下帷幕。 為了備戰(zhàn)世錦賽,勇利回到了長谷津,在奧川美奈子老師的幫助下繼續(xù)練習(xí),芭蕾的基本動作他...
    樓長路閱讀 400評論 0 0

友情鏈接更多精彩內(nèi)容