http://www.javashuo.com/article/p-yxfkvshy-mm.htmljava
在程序模块下面的build.gradle中须要引入的依赖包:通常Androidstudio新建项目就会自动生成node
testImplementation-引入的依赖是java unit单元测试,是运行在当前电脑的jvm上的单元测试;android
androidTestImplementation-引入的依赖是Android单元测试,是运行在Android环境的单元测试。json
若是AndroidStudio当前项目视图为Android,须要切换为Project视图,在程序模块下面的src目录下添加androidTest/java(Android单元测试,运行在Android环境的单元测试)和test/java(JUnit单元测试,运行在当前电脑的jvm上的单元测试),而后在里面添加包名和测试类。api
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(); } } }
public class TestUtil {
@Before
public void setUp() throws Exception { } @Test public void isEmpty() { assertEquals(true, TextUtils.isEmpty("")); } }
在测试类中的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
在终端使用gradle运行test任务,能够执行全部的单元测试方法(在AndroidStudio的Terminal运行gradlew test,在系统终端中运行gradle -p 项目路径 test,gradle没有配置环境变量,须要绝对路径),运行完成后,就会运行全部的单元测试方法,而且会显示结果,以下图:性能
<?xml version ="1.0" encoding ="utf-8"?> <中国> <北京> <昌平></昌平> <海淀></海淀> </北京> </中国>
<?xml version ="1.0" encoding ="utf-8"?>文档声明必须写在第一行
保存的时候xml声明的编码要跟文件保存的编码保存一致,若是不声明编码默认utf-8
<中国> <北京> <昌平></昌平> <海淀></海淀> </北京> </中国>
1.属性要写在开始标签中
2.属性的命名规则跟元素的命名规则同样
3.属性必定要用引号包起来,单引号双引号均可以
4.属性的内容能够用子标签形式表示
<!-- 注释-->
CDATA 注释 能够包含大于小于号,不会被解析器解析
<![CDATA[<北京></北京>]]>
特殊字符 | 特殊字符 |
& | & |
< | < |
> | > |
" | " |
' | ' |
https://www.w3school.com.cn/schema/schema_howto.asp
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(); } } }
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); } } } }
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(); } } }
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(); } }