day01

mac2024-07-11  13

1.集成开发环境

MyEclipse Eclipse ee

2.junit 单元测试

```java @Test 2. public void testAdd() { 3. MyMath math = new MyMath(); 4. int result = math.add(2, 3); 5. //断言 原理就是拿运行的结果和期望的结果进行比较 如果相同说明测试成功 6. assertEquals(5, result); 7. } 3.注解 注解 jdk1.5之后加入的api 预置注解三个 Deprecated 当前方法是过时的 在api中有更好的实现 Supresswarnings 压制警告 Override 当前方法是覆盖了父类的方法 4 xml的介绍 XML是指可扩展标记语言(Extensible Markup Language) 作用 ①可以在客户端(client)/服务器(server)之间传递数据 服务器 装着服务端程序的高配置电脑 cpu intel 志强 处理器 ② 用来保存有关系的数据 ③ 用来做配置文件 在android当中 界面的布局而文件 还有 清单文件都是用xml文件来描述的 5 xml的基本语法 gbk 2万 gb2312 5千多个汉字 utf-8 文档声明 <?xml version="1.0"?> 最简单的xml文档声明 文档声明必须写在第一行 保存的时候 xml声明的编码 要跟文件保存的编码保持一致 如果不声明编码 默认使用的是utf-8 <?xml version="1.0" encoding="utf-8"?> 用standalone属性说明文档是否独立,即是否依赖其他文档。 如:<?xml version=“1.0” standalone=“yes”?> yes说明独立 不依赖其他文档 元素 <tag></tag> 起始标签 闭合标签 标签必须闭合 如果标签中没有其他内容可以自闭合<tag/> 标签嵌套的时候 需要注意 先开始的标签后闭合 后开始的标签先闭合 根标签必须有只能有一个 标签换行制表符都会保留 需要注意 书写的时候 如果用了这些符号 就会导致流量的浪费 元素的命名规则 跟java变量名的命名规则类似 xml的保留字是xml 所以不能以xml开头 属性 ①属性要写在开始标签中 ②属性的命名规则跟元素的命名规则一样 ③属性一定要用引号包起来 单引号 双引号都可以 ④属性的内容可以用子标签的形式来表示 ```java 1.<?xml version="1.0" encoding="UTF-8"?> 2.<Persons> 3. <person name="liufeng"> 4. <firstName>feng</firstName> 5. <lastName>liu</lastName> 6. </person> 7.</Persons>

注释

注释不能嵌套 不能在文档的第一行

1.<!-- 我是注释 ctrl + shift +/-->

CDATA区

通过CDATA区传递的内容不会被解析器解析

1.<![CDATA[ liu <<<<< >>>>>> ]]>

特殊字符

**

6 xml的约束

**

格式良好的XML: 遵循XML语法的XML

有效的XML:遵循约束文档的XML

格式良好不一定有效 有效的一定格式良好

约束的作用:约束文档定义了XML中允许出现的元素名称,属性及元素出现的顺序

名称空间 namespace 对应一个约束文档

com.itheima.test.a.java

com.itheima.a.java

html:Table </html:Table>

life:Table</life:Table>

Dtd 独立的dtd文档 扩展名dtd 编码必须是utf-8

可以声明在xml文件中

通过dtd可以约束元素的名称 元素出现的顺序 出现的次数 属性的名称 属性的类型 属性是否必须出现 属性的值是否可以重复

1.<?xml version="1.0" encoding="GBK"?> 2.<!DOCTYPE 书架 [ 3. <!ELEMENT 书架 (+)> 4. <!ELEMENT 书 (书名,作者,售价)> 5. <!ELEMENT 书名 (#PCDATA)> 6. <!ELEMENT 作者 (#PCDATA)> 7. <!ELEMENT 售价 (#PCDATA)> 8. <!ATTLIST 书 9. ISBN ID #REQUIRED 10. COMMENT (a|b) #IMPLIED 11. 出版社 CDATA "传智播客" 12. > 13. <!ENTITY copyright "黑马训练营"> 14.]> 15.<书架> 16. <书 ISBN="a" COMMENT="b" > 17. <书名>Java就业培训教程</书名> 18. <作者>&copyright;</作者> 19. <售价>39.00</售价> 20. </> 21. <书 ISBN="b"> 22. <书名>JavaScript网页开发</书名> 23. <作者>张孝祥</作者> 24. <售价>28.00</售价> 25. </> 26.</书架>

Schema

①扩展名 .xsd 本身是一份xml文档

②对名称空间(namespace)支持的很好

③ 支持的类型比dtd跟丰富约束的更细致 可以支持自定义的类型

④ schema正在逐步替换dtd 在android中清单文件和布局文件 用到了schema约束技术

①xml的约束技术 作用 规范xml文件的书写(标签 属性 文本)

②xml约束 常用的技术 dtd schema

③android用到的约束 schema

④ 名称空间 namespace

7 解析xml文档

Dom解析

Sax解析

Pull解析

Dom解析

① 把整个文档先加载到内存中-> Document 所以可以对文档进行修改

② 如果文件比较大 可能会导致内存溢出

编程思路 DocumentBuilderFactory->DocumentBuilder->Document->通过节点获得NodeList->具体的Node 如果想修改 TransformerFactory->Transformer->transform(Souce, result)

1.public class DomParseTest { 2. 3. @Test 4. public void domParse() throws Exception{ 5. //获取DocumentBuilderFactory 6. DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 7. //获取DocumentBuilder 8. DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder(); 9. //通过documentBuilder 解析xml文档获得Document对象 10. Document document = documentBuilder.parse("book.xml"); 11. //通过元素的名字可以找到元素的集合 12. NodeList nodeList = document.getElementsByTagName("售价"); 13. //nodeList.getLength(); 14. for(int i = 0;i<nodeList.getLength();i++){ 15. Node node = nodeList.item(i); 16. String content = node.getTextContent(); 17. System.out.println(content); 18. } 19. //找到第二个元素 20. Node node = nodeList.item(0); 21. //读出对应节点的文本内容 22. String content = node.getTextContent(); 23. System.out.println(content); 24. } @Test public void domModifyxml() throws Exception{ 28. DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 29. DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder(); 30. Document document = builder.parse("book.xml"); 31. NodeList nodeList = document.getElementsByTagName("售价"); 32. Node node = nodeList.item(1); 33. //修改节点的内容 34. node.setTextContent("199.00元"); 35. 36. TransformerFactory transformerFactory = TransformerFactory.newInstance(); 37. Transformer transformer = transformerFactory.newTransformer(); 38. //数据源 39. Source xmlSource = new DOMSource(document); 40. //要输出到的目的地 41. Result outputTarget = new StreamResult("book.xml"); 42. transformer.transform(xmlSource, outputTarget); 43. } 44.}

8 sax

原理 一个元素一个元素解析 解析到一个元素调用相关的方法 startDocument() 文档开始 endDocument 文档结束 startElement 元素开始 endElement元素结束 characters 文本内容

@Test 2. public void saxParser() throws Exception{ 3. //获取工厂 4. SAXParserFactory parserFactory = SAXParserFactory.newInstance(); 5. SAXParser saxParser = parserFactory.newSAXParser(); 6. //获取xmlReader通过这个reader可以试着 ContentHandler 7. XMLReader xmlReader = saxParser.getXMLReader(); 8. //给xmlReader设置contentHandler contentHandler是一个接口 里面太多的方法没实现 9. //不去直接实现contenthandler 而是继承它默认的实现 DefaultHandler 10. xmlReader.setContentHandler(new Myhandler()); 11. //解析xml文档 12. xmlReader.parse("book.xml"); 13. } 14. 15. private class Myhandler extends DefaultHandler{ 16. 17. @Override 18. public void startDocument() throws SAXException { 19. System.out.println("文档开始"); 20. } 21. 22. @Override 23. public void endDocument() throws SAXException { 24. System.out.println("文档结束"); 25. } 26. 27. @Override 28. public void startElement(String uri, String localName, String qName, Attributes attributes) 29. throws SAXException { 30. System.out.println("开始标签<"+qName+">"); 31. } 32. 33. @Override 34. public void endElement(String uri, String localName, String qName) throws SAXException { 35. System.out.println("结束标签</"+qName+">"); 36. } 37. 38. @Override 39. public void characters(char[] ch, int start, int length) throws SAXException { 40. //文本内容 41. String text = new String(ch,start,length); 42. System.out.println("文本内容"+text); 43. } 44. 45. } 读出某一个元素对应的内容 1.@Test 2. public void saxParserTest2() throws Exception{ 3. SAXParserFactory parserFactory = SAXParserFactory.newInstance(); 4. SAXParser parser = parserFactory.newSAXParser(); 5. XMLReader reader = parser.getXMLReader(); 6. reader.setContentHandler(new DefaultHandler(){ 7. boolean isPrice = false; 8. int count = 0; 9. @Override 10. public void startElement(String uri, String localName, String qName, Attributes attributes) 11. throws SAXException { 12. if("售价".equals(qName)){ 13. isPrice = true; 14. count++; 15. } 16. } 17. 18. @Override 19. public void endElement(String uri, String localName, String qName) throws SAXException { 20. if("售价".equals(qName)){ 21. isPrice = false; 22. } 23. } 24. 25. @Override 26. public void characters(char[] ch, int start, int length) throws SAXException { 27. if(isPrice && count == 2){ 28. System.out.println(new String(ch,start,length)); 29. } 30. } 31. }); 32. reader.parse("book.xml"); 33. } 解析成arraylist 1.@Test 2. public void saxParse2list() throws Exception{ 3. SAXParserFactory parserFactory = SAXParserFactory.newInstance(); 4. SAXParser parser = parserFactory.newSAXParser(); 5. XMLReader reader = parser.getXMLReader(); 6. reader.setContentHandler(new DefaultHandler(){ 7. ArrayList<Book> bookshelf = null; 8. Book book = null; 9. String tag = null; 10. 11. @Override 12. public void startElement(String uri, String localName, String qName, Attributes attributes) 13. throws SAXException { 14. if("书架".equals(qName)){ 15. //创建集合 16. bookshelf = new ArrayList<Book>(); 17. }else if("书".equals(qName)){ 18. //创建book对象 19. book = new Book(); 20. }else if("书名".equals(qName)){ 21. tag = "书名"; 22. }else if("作者".equals(qName)){ 23. tag = "作者"; 24. }else if("售价".equals(qName)){ 25. tag = "售价"; 26. } 27. } 28. 29. @Override 30. public void endElement(String uri, String localName, String qName) throws SAXException { 31. //每次走到结束标签 都要把tag复原为null 32. tag = null; 33. if("书架".equals(qName)){ 34. for(Book book1:bookshelf){ 35. System.out.println(book1); 36. } 37. }else if("书".equals(qName)){ 38. //读到书的结束标签 把book对象添加到集合中 39. bookshelf.add(book); 40. } 41. } 42. 43. @Override 44. public void characters(char[] ch, int start, int length) throws SAXException { 45. if("书名".equals(tag)){ 46. book.setTitle(new String(ch,start,length)); 47. }else if("作者".equals(tag)){ 48. book.setAuthor(new String(ch,start,length)); 49. }else if("售价".equals(tag)){ 50. book.setPrice(new String(ch,start,length)); 51. } 52. } 53. 54. }); 55. reader.parse("book.xml"); 56. }

~~

9 pull 解析 ☆☆☆☆☆

~~

调用next方法 解析下一个元素 每调用一次 解析一个元素

1.public class PullParserTest { 2. 3. @Test 4. public void pullTest() throws Exception { 5. ArrayList<Book> books = null; 6. Book book = null; 7. // 获取工厂 8. XmlPullParserFactory parserFactory = XmlPullParserFactory.newInstance(); 9. // 获取到xml的解析器 10. XmlPullParser parser = parserFactory.newPullParser(); 11. // 给解析器设置一个输入源 12. // 第一个参数输入流 第二个参数 文档用到的字符编码集 13. parser.setInput(new FileInputStream(new File("book.xml")), "utf-8"); 14. // 获取当前事件类型 15. int eventType = parser.getEventType(); 16. boolean flag = true; 17. while (eventType != XmlPullParser.END_DOCUMENT && flag) { 18. switch (eventType) { 19. case XmlPullParser.START_TAG: 20. //开始标签 21. //parser.getName 获取当前事件对应的元素名字 22. if("书架".equals(parser.getName())){ 23. //创建一个集合 24. books = new ArrayList<>(); 25. }else if("书".equals(parser.getName())){ 26. //创建一个book 对象 27. book = new Book(); 28. }else if("书名".equals(parser.getName())){ 29. //给book 对象设置书名的属性 30. book.setTitle(parser.nextText()); //parser.nextText()获取当前节点的下一个文本内容 31. }else if("作者".equals(parser.getName())){ 32. //给book 对象设置作者的属性 33. book.setAuthor(parser.nextText()); 34. }else if("售价".equals(parser.getName())){ 35. //给book 对象设置售价的属性 36. book.setPrice(parser.nextText()); 37. } 38. break; 39. case XmlPullParser.END_TAG: 40. //结束标签 41. if("书".equals(parser.getName())){ 42. //把book 对象添加到集合中 43. books.add(book); 44. flag = false; 45. } 46. break; 47. } 48. 49. // 调用parser.next方法解析下一个元素 用这个结果来更新eventType 如果解析到文档结束那么就会推出循环 50. // 如果不更新这个eventType 就是死循环 51. eventType = parser.next(); 52. } 53. 54. //遍历集合 55. for(Book book1:books){ 56. System.out.println(book1); 57. } 58. } 59. 60.} 10 json 介绍和解析 ☆☆☆☆☆ Json两种数据格式 jsonObject jsonArray 保存方式类似键值对 key:value 1.public class JsonParseDemo { 2. 3. @Test 4. public void jsonTest() throws Exception{ 5. String jstring = "{'name':'张三','age':'20'}"; 6. //通过一个具有json格式的字符串就可以创建一个json对象 7. JSONObject obj = new JSONObject(jstring); 8. //获取json对象之后 就可以通过key 去取值 根据需求选择相关的getXXXX方法 9. //可以获取的数据类型 string int long double boolean object 10. String name = obj.getString("name"); 11. int age = obj.getInt("age"); 12. System.out.println("名字:"+name+"age"+age); 13. 14. String jsonArray = "[{'name':'张三','age':'20'},{'name':'李四','age':'22'}]"; 15. //根据一个具有json数组格式的字符串 创建一个json数组对象 16. JSONArray array = new JSONArray(jsonArray); 17. for(int i = 0 ;i<array.length();i++){ 18. //根据索引 取出每一个jsonobject 19. JSONObject jsonObject = array.getJSONObject(i); 20. // 21. name = jsonObject.getString("name"); 22. System.out.println(name); 23. 24. } 25. } 26.}

xml的语法☆☆☆☆☆

xml的约束☆☆☆

dom sax ☆☆ 记住思路 以及特点

Document

sax 一个元素一个元素的解析 不能停 XmlReader setContentHandler

最新回复(0)