一 數據格式xml&json入門與解析

 

一 單元測試方法

http://www.javashuo.com/article/p-yxfkvshy-mm.htmljava

1.1  添加單元測試依賴包

    在程序模塊下面的build.gradle中須要引入的依賴包:通常Androidstudio新建項目就會自動生成node

testImplementation-引入的依賴是java unit單元測試,是運行在當前電腦的jvm上的單元測試;android

androidTestImplementation-引入的依賴是Android單元測試,是運行在Android環境的單元測試。json

1.2 添加測試代碼目錄

    若是AndroidStudio當前項目視圖爲Android,須要切換爲Project視圖,在程序模塊下面的src目錄下添加androidTest/java(Android單元測試,運行在Android環境的單元測試)和test/java(JUnit單元測試,運行在當前電腦的jvm上的單元測試),而後在裏面添加包名和測試類。api

 

 

 

  • androidTest/java(Android單元測試,運行在當前電腦的jvm上的單元測試,執行測試的時候須要Android鏈接設備,速度比較慢,適合須要調用Android api的單元測試)
  • test/java(JUnit單元測試,用來放不須要Android依賴的單元測試類,運行在當前電腦的jvm上的單元測試,速度快,適合只是對java代碼功能進行單元測試)

1.3 添加單元測試類

1.3.1手動編寫單元測試類

1.3.1.1  androidTest測試類

    androidTest測試類適用於須要依賴Android api的單元測試,須要鏈接Android設備才能進行測試。新建的androidTest java類須要添加@RunWith(AndroidJUnit4.class)註解,類的方法若是是測試入口方法須要添加@Test註解。
示例代碼:路徑 app\src\androidTest\java\com\example\itandroid_1app

public class MainActivityTest {

    private Context mTargetContext; @Before public void setUP() throws Exception { mTargetContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); } @Test public void onCreate() { try { ApplicationInfo applicationInfo = mTargetContext.getPackageManager().getApplicationInfo(mTargetContext.getPackageName(), PackageManager.GET_META_DATA); Bundle metaData = applicationInfo.metaData; String data = metaData.getString("com.panzq.Androidtest"); assertEquals("123456", data); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } } }

1.3.1.2  test測試類

    test測試類適用於純java的單元測試,運行於當前設備的jvm環境中,無需Android設備便可測試。新建test java類,類的方法若是是測試入口方法須要添加@Test註解。
代碼示例:路徑app\src\test\java\com\example\itandroid_1
public class TestUtil {
    @Before
    public void setUp() throws Exception { } @Test public void isEmpty() { assertEquals(true, TextUtils.isEmpty("")); } }

 

1.3.1.3 測試類中的setUp方法

    在測試類中的setUp方法,能夠在啓動測試前進行一些初始化,好比測試類中的變量等初始化,這個方法須要添加@Before註解。dom

說明:
上面的示例代碼中能夠直接使用assertEquals,是由於使用了靜態import方法引入了相應的包(import static org.junit.Assert.*;)
根據測試的功能合理使用androidTest和test,提升單元測試效率。
2.2 自動生成測試類和測試方法
        上面介紹的是手動添加測試類和測試方法,如下介紹自動生成測試類和方法。在項目源碼中選中須要添加單元測試的類並打開,在內容顯示區域「右鍵」->「Go To」,在彈出窗口中選擇「Test」,在彈出窗口中選擇「Create New Test ......」jvm

 

 

 在接下來彈出的對話框中,勾選須要添加單元測試的方法,在這裏有個「Generate」通用方法生成,能夠選擇setUp/@Before(啓動前調用,可用於初始化)和tearDown/@After(結束後調用)ide

 

 

1.3 運行單元測試

1.3.1 運行單個測試方法

    在測試方法題內部,「右鍵」,在彈出菜單中選擇「Run 方法名」便可(單元測試也可使用斷點調試和性能調試)。

 

 

1.3.2 批量運行測試方法(有些狀況下可能會沒法實現)    

  在終端使用gradle運行test任務,能夠執行全部的單元測試方法(在AndroidStudio的Terminal運行gradlew test,在系統終端中運行gradle -p 項目路徑 test,gradle沒有配置環境變量,須要絕對路徑),運行完成後,就會運行全部的單元測試方法,而且會顯示結果,以下圖:性能

 

 

二 XML語法 

<?xml version ="1.0" encoding ="utf-8"?>
<中國>
    <北京>
        <昌平></昌平>
        <海淀></海淀>
    </北京>
</中國>

2.1文檔聲明

<?xml version ="1.0" encoding ="utf-8"?>文檔聲明必須寫在第一行
保存的時候xml聲明的編碼要跟文件保存的編碼保存一致,若是不聲明編碼默認utf-8

2.2 元素

<中國>
    <北京>
        <昌平></昌平>
        <海淀></海淀>
    </北京>
</中國>

 

2.3 屬性

1.屬性要寫在開始標籤中

2.屬性的命名規則跟元素的命名規則同樣

3.屬性必定要用引號包起來,單引號雙引號均可以

4.屬性的內容能夠用子標籤形式表示

2.4 註釋

<!-- 註釋-->

CDATA 註釋 能夠包含大於小於號,不會被解析器解析

<![CDATA[<北京></北京>]]>

2.5 特殊字符 轉義

特殊字符 特殊字符
& &amp;
< &lt;
> &gt;
" &quot;
' &apos;

 

2.6 shcema

https://www.w3school.com.cn/schema/schema_howto.asp

 

2.7 Dom 解析

 dom解析xml的優勢:

  由於分配了一個樹形結構,很方便的實現增長修改刪除操做

dom解析xml的缺點

  若是要解析文件過大,一次性哎內存中分配一個樹形結構,操做內存的溢出。

public class DomParseUtil {
    public void domParse() {
        //1.獲取DocumentBuilderFactory
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        try {
            //2.獲取DocumentBuilder
            DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();
            //3.經過DocumentBuilder解析xml文檔得到Document對象
            Document document = documentBuilder.parse("xml.xml");
            //4.經過元素的名字能夠找到元素的集合
            NodeList nodeList = document.getElementsByTagName("書名");

            //獲取節點個數nodeList.getLength();
            for (int i = 0; i < nodeList.getLength(); i++) {
                //5.找到第二個元素,第二個書名
                Node node = nodeList.item(1);
                //6.讀取對應節點的文本內容
                String content = node.getTextContent();
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void domModifyXml() {
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            Document document = documentBuilder.parse("book.xml");
            NodeList nodeList = document.getElementsByTagName("售價");
            Node node = nodeList.item(1);
            node.setTextContent("99.00元");
            //修改xml中的內容,只有dom能夠修改
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            Source xmlSource = new DOMSource(document);
            Result outputTarget = new StreamResult("book.xml");
            transformer.transform(xmlSource, outputTarget);
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        }
    }
}

2.8 sax解析

  sax解析方式:邊讀邊解析

使用sax方式督導特定的標籤時候,自動調用相應的方式進行操做

sax解析xml的優勢: 不會形成內存溢出

sax解析缺點:不能修改xml文件

public class SaxParseUtil {
    private MycontentHandler handler;
    private ArrayList<BookBean> books = new ArrayList<>();
    private String tag;
    private BookBean bookBean;

    public SaxParseUtil() {
        this.handler = new MycontentHandler();
    }

    public void saxParser() {
        //獲取工廠
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
        try {
            SAXParser saxParser = saxParserFactory.newSAXParser();
            //獲取xmlReader經過reader能夠試着獲取ContentHandler
            XMLReader xmlReader = saxParser.getXMLReader();
            //給xmlReader設置ContentHandler ContentHandler是一個接口,裏面太多的方法沒實現
            //不去直接實現ContentHandler而是繼承它默認的實現DefaultHandler
            xmlReader.setContentHandler(handler);
            //開始解析文檔 這裏傳入xml路徑
            xmlReader.parse("book.xml");
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private class MycontentHandler extends DefaultHandler {
        @Override
        public void startDocument() throws SAXException {
            Log.d("panzq", "文檔開始");

        }

        @Override
        public void endDocument() throws SAXException {
            Log.d("panzq", "文檔開始");
        }

        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            Log.d("panzq", "開始標籤" + qName);
            if ("書架".equals(qName)) {
                books = new ArrayList<>();
            } else if ("書".equals(qName)) {
                bookBean = new BookBean();
            } else if ("書名".equals(qName)) {
                tag = "書名";
            } else if ("做者".equals(qName)) {
                tag = "做者";
            } else if ("售價".equals(qName)) {
                tag = "售價";
            }
        }

        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            Log.d("panzq", "結束標籤" + qName);
            tag = null;
            if ("書架".equals(qName)) {
                for (BookBean bookBean : books) {
                    Log.d("panzq", "books : " + books);
                }
            } else if ("書".equals(qName)) {
                books.add(bookBean);
            }
        }

        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            String text = new String(ch, start, length);//拿到具體的文本
            Log.d("panzq", "文本內容" + text);
            if (tag.equals("書名")) {
                bookBean.setTitle(text);
            } else if (tag.equals("做者")) {
                bookBean.setAuthor(text);
            } else if (tag.equals("售價")) {
                bookBean.setPrice(text);
            }
        }
    }

}

2.9 Pull 解析

 

public class PullParserUtil {

    public void pullTest() {
        try {
            //獲取工廠
            XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
            //獲取xml的解析器
            XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();
            //給解析器設置一個輸入源
            //第一個參數輸入流 第二個參數 文檔用到的字符編碼器
            xmlPullParser.setInput(new FileInputStream(new File("book.xml")), "utf-8");
            //獲取當前事件類型
            int eventType = xmlPullParser.getEventType();

            ArrayList<BookBean> books = null;
            BookBean bookBean = null;
            while (eventType != XmlPullParser.END_DOCUMENT) {
                switch (eventType) {
                    case XmlPullParser.START_TAG:
                        //xmlPullParser.getName()獲取當前事件對應的元素的名字
                        if ("書架".equals(xmlPullParser.getName())) {
                            //建立一個集合
                            books = new ArrayList<>();
                        } else if ("書".equals(xmlPullParser.getName())) {
                            //建立一個book對象
                            bookBean = new BookBean();
                        } else if ("書名".equals(xmlPullParser.getName())) {
                            //xmlPullParser.nextText()獲取當前節點的下一個內容
                            bookBean.setTitle(xmlPullParser.nextText());
                        } else if ("做者".equals(xmlPullParser.getName())) {
                            bookBean.setAuthor(xmlPullParser.nextText());
                        } else if ("售價".equals(xmlPullParser.getName())) {
                            bookBean.setPrice(xmlPullParser.nextText());
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        if ("書".equals(xmlPullParser.getName())) {
                            books.add(bookBean);
                        }
                        break;
                }
                //調用xmlPullParser.next()方法解析下一個元素,用這個結果來更新eventType若是解析到文檔結束那麼就會退出
                //若是不更新這個eventType就是死循環
                eventType = xmlPullParser.next();
            }
            
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

2.10 Json

 

public void JsonParser() {
        String jstring = "{'name':'張三','age':'20'}";
        try {
            JSONObject jsonObject = new JSONObject(jstring);
            String name = jsonObject.getString("name");
            int age = jsonObject.getInt("age");
            Log.d("panzq", "name = " + name + " , age = " + age);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        String jsonArray="[{'name':'張三','age':'20'},{'name':'李四','age':'30'}]";
        try {
            JSONArray array = new JSONArray(jsonArray);
            for (int i=0;i<array.length();i++) {
                JSONObject jsonObject = array.getJSONObject(i);
                String name = jsonObject.getString("name");
                int age = jsonObject.getInt("age");
                Log.d("panzq", "name = " + name + " , age = " + age);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }
相關文章
相關標籤/搜索