1.集成开发环境
MyEclipse Eclipse ee
注释
注释不能嵌套 不能在文档的第一行
1.<!-- 我是注释 ctrl + shift +/-->CDATA区
通过CDATA区传递的内容不会被解析器解析
1.<![CDATA[ liu <<<<< >>>>>> ]]>
特殊字符
**
**
格式良好的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. <作者>©right;</作者> 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. }~~
~~
调用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