day01_xml,xml约束xml解析

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

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

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

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

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

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

    ②xml约束 常用的技术 dtd schema

    ③android用到的约束 schema

    ④ 名称空间 namespace

7 解析xml文档

  1. Dom解析

    Sax解析

    Pull解析

Dom解析

  1. ① 把整个文档先加载到内存中-> 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值