第一天 xml,xml约束,xml解析

1.集成开发环境

MyEclipse Eclipse ee

2.junit 单元测试

  1. @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说明独立 不依赖其他文档

元素

起始标签 闭合标签

标签必须闭合

如果标签中没有其他内容可以自闭合

标签嵌套的时候 需要注意 先开始的标签后闭合 后开始的标签先闭合

根标签必须有只能有一个

标签换行制表符都会保留 需要注意 书写的时候 如果用了这些符号 就会导致流量的浪费

元素的命名规则 跟java变量名的命名规则类似 xml的保留字是xml 所以不能以xml开头

属性

①属性要写在开始标签中

②属性的命名规则跟元素的命名规则一样

③属性一定要用引号包起来 单引号 双引号都可以

④属性的内容可以用子标签的形式来表示

1.<?xml version="1.0" encoding="UTF-8"?>
2.
3.
4. feng
5. liu
6.
7.

注释

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

1.

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.
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. }
25.
26. @Test
27. 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 文本内容

  1. @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. private class Myhandler extends DefaultHandler{
  15. @Override
    
  16. public void startDocument() throws SAXException {
    
  17. 	System.out.println("文档开始");
    
  18. }
    
  19. @Override
    
  20. public void endDocument() throws SAXException {
    
  21. 	System.out.println("文档结束");
    
  22. }
    
  23. @Override
    
  24. public void startElement(String uri, String localName, String qName, Attributes attributes)
    
  25. 		throws SAXException {
    
  26. 	System.out.println("开始标签<"+qName+">");
    
  27. }
    
  28. @Override
    
  29. public void endElement(String uri, String localName, String qName) throws SAXException {
    
  30. 	System.out.println("结束标签</"+qName+">");
    
  31. }
    
  32. @Override
    
  33. public void characters(char[] ch, int start, int length) throws SAXException {
    
  34. 	//文本内容
    
  35. 	String text = new String(ch,start,length);
    
  36. 	System.out.println("文本内容"+text);
    
  37. }
    
  38. }

读出某一个元素对应的内容

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 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();
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 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

发布了23 篇原创文章 · 获赞 0 · 访问量 237

猜你喜欢

转载自blog.csdn.net/qq_41518179/article/details/102843363