XML的介绍和基本使用


XML和JSON的作用

在开发中如果两者或以上的数据传输,直接传输数据,在面对字符类的数据时,例如含空格,#等特殊符号的密码时,程序认为空格这些特殊字符为字段分割符,可能会出现数据传输错误的情况。所以 XML和JSON的标记语言的作用就来了。


XML

<?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person id="10001" groupid="1">
		<name>李四</name>
		<age>18</age>
	</person>
	<person id="10002" groupid="1">
		<name>张三</name>
		<age>20</age>
</person>
<!--注释: -->

XML与Html的语法类似,标签与标签之间可以相互嵌套,
画完图发现第一个person写错了,原谅我懒得改。绿色背景色是Persons

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>是文档类型的申明,版本和类型。

通过结构图很容易理解XML格式的书写,特别注意:标签里面的属性值必须要加引号,例入上面的:id=“10002” groupid=“1”。

1.CDATA语法:

当我们的数据中含有标签,属性等数据时,为了保证数据的完整性XML中有cdata语法来解决。

CDATA 部分中的所有内容都会被解析器忽略。
CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束:

例如:

<![CDATA[张三<name>18<年龄>]]>

那么在解析XML时就会解析保留和<年龄>内容。

2.XML解析:

Java中xml解析分为四种,分别为:SAX解析,DOM解析,JDOM解析和DOM4J解析。看名称就可以想到JDOM解析和DOM4J解析是DOM解析的衍生,所以也可以以统筹任务有SAX和DOM解析两种。

1.SAX:

理论呢,尽可能看一看吧
解析方式是事件驱动机制 !
SAX解析器, 逐行读取XML文件解析 , 每当解析到一个标签的开始/结束/内容/属性时,触
发事件.
我们可以编写程序在这些事件发生时, 进行相应的处理.
优点:
分析能够立即开始,而不是等待所有的数据被处理
逐行加载,节省内存.有助于解析大于系统内存的文档
有时不必解析整个文档,它可以在某个条件得到满足时停止解析.
缺点:

  1. 单向解析,无法定位文档层次,无法同时访问同一文档的不同部分数据(因为逐
    行解析, 当解析第n行是, 第n-1行已经被释放了, 无法在进行操作了).
  2. 无法得知事件发生时元素的层次, 只能自己维护节点的父/子关系.
  3. 只读解析方式, 无法修改XML文档的内容.

简单说一下上面的理论,首先SAX解释是逐行读取。在加载下一行时上一行已经被GC回收释放。
只能自己维护节点的父/子关系的这一点呢,可以往上看看一开始的示例代码,因为无法获取元素的层次,解析时会将其所有的父类和子类一同解析。

2.DOM:

这里还是理论部分
是用与平台和语言无关的方式表示XML文档的官方W3C标准,分析该结构通常需要加载整个
文档和内存中建立文档树模型.程序员可以通过操作文档树, 来完成数据的获取 修改 删除等.
优点:
文档在内存中加载, 允许对数据和结构做出更改.
访问是双向的,可以在任何时候在树中双向解析数据。
缺点:
文档全部加载在内存中 , 消耗资源大.

这里好像没什么好说的,简单讲讲吧
树状结构能上面的结构图已经很清晰了,资源消耗问题呢,怎么说呢,理论毕竟是理论吗。通常我们的标记文档呢就几kb,好像消耗这个可以忽略,毕竟程序员谁不喜欢操作方便的方法呢。所以解析大多数用DOM解析

3.JDOM:

这里还是它
JDOM解析
目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一
个Java特定模型,JDOM一直得到大力推广和促进。
JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题”
(根据学习曲线假定为20%)
优点:
使用具体类而不是接口,简化了DOM的API。
大量使用了Java集合类,方便了Java开发人员。
缺点:
DOM4J解析XML 掌握
文档对象 Document
元素对象 Element
没有较好的灵活性。
性能不是那么优异。

4.DOM4J:

终究还是它
它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath
支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,
DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一
个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML

目前许多开源项目中大量采用DOM4J , 例如:Hibernate。
解释一下XPATH吧,就是XML路径的意思,可以通过路径去获取XML文件。

3.XML解析操作:

这么多的理论我都烦了,SO接下来我们直接上操作

//1. 引入jar文件 dom4j.jar
//2. 创建一个指向XML文件的输入流
FileInputStream fis = new FileInputStream("xml文件的地址");
//3. 创建一个XML读取工具对象
SAXReader sr = new SAXReader();
//4. 使用读取工具对象, 读取XML文档的输入流 , 并得到文档对象
Document doc = sr.read(fis);
//5. 通过文档对象, 获取XML文档中的根元素对象
Element root = doc.getRootElement();

jar包链接放这了需要自取,失效可以留言或私信提醒我哦。
链接https://pan.baidu.com/s/1XD3HvJ82dHfiUAr9SSUGUg 提取码:8qnk
文档对象Document指的是内存中刚刚读取的整个XML文档数据对象

//常用方法:
//1. 通过文档对象, 获取XML文档中的根元素对象
Element root = doc.getRootElement();
//2. 添加根节点
Element root = doc.addElement("根节点名称");

Element是文档中的单个节点,例如上面示例的person节点

//常用方法:
//1. 获取节点名称
String getName();
//2. 获取节点内容
String getText();
//3. 设置节点内容
String setText();
//4. 根据子节点的名称 , 获取匹配名称的第一个子节点对象.
Element element(String 子节点名称);
//5. 获取所有的子节点对象
List<Element> elements();
//6. 获取节点的属性值
String attributeValue(String 属性名称);
//7. 获取子节点的内容
String elementText(String 子节点名称);
//8. 添加子节点
Element addElement(String 子节点名称);
//9. 添加属性
void addAttribute(String 属性名,String 属性值);

4.在程序中编写XML:

先创建一个XML的对象,后面的写入,和io流基本一致

//1. 通过文档帮助器 (DocumentHelper) , 创建空的文档对象
Document doc = DocumentHelper.createDocument();
//2. 通过文档对象, 向其中添加根节点
Element root = doc.addElement("根节点名称");
//3. 通过根节点对象root , 丰富我们的子节点
Element e = root.addElement("元素名称");
//4. 创建一个文件输出流 ,用于存储XML文件
FileOutputStream fos = new FileOutputStream("要存储的位置");
//5. 将文件输出流, 转换为XML文档输出流
XMLWriter xw = new XMLWriter(fos);
//6. 写出文档
xw.write(doc);
//7. 释放资源
xw.close();

5.实际案例:

实际案例:

1.本地:

//1. 获取文件的输入流
FileInputStream fis = newFileInputStream("C:\\Demo.xml");
//2. 创建XML读取工具对象
SAXReader sr = new SAXReader();
//3. 通过读取工具, 读取XML文档的输入流 , 并得到文档对象
Document doc = sr.read(fis);
//4. 通过文档对象 , 获取文档的根节点对象
Element root = doc.getRootElement();
//5. 通过根节点, 获取所有子节点
List<Element> es = root.elements();
//6. 循环遍历三个子节点
for (Element e : es) {
	//1. 获取id属性值
	String id = e.attributeValue("id");
	//2. 获取子节点name , 并获取它的内容
	String name = e.element("name").getText();
	//3. 获取子节点info , 并获取它的内容
	String info = e.element("sex").getText();
	System.out.println("id="+id+",name="+name+",sex="+sex);
}

2.API接入:

像聚合,阿里,腾讯这些都有一些API的数据接口,可以自己去玩玩免费的。
聚合:https://www.juhe.cn/docs
腾讯:https://cloud.tencent.com/api


String phone = "phonenumber";
//1. 获取到XML资源的输入流
URL url = new URL("http://apis.juhe.cn/mobile/get?
phone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
//2. 创建一个XML读取对象
SAXReader sr = new SAXReader();
//3. 通过读取对象 读取XML数据,并返回文档对象
Document doc = sr.read(is);
//4. 获取根节点
Element root = doc.getRootElement();
//5. 解析内容
String code = root.elementText("resultcode");
if("200".equals(code)){
	Element result = root.element("result");
	String province = result.elementText("province");
	String city = result.elementText("city");
	if(province.equals(city)){
		System.out.println("手机号码归属地为:"+city);
	}else{
		System.out.println("手机号码归属地为:"+province+" "+city);
}else{
	System.out.println("请输入正确的手机号码");
}
fis.close();
is.close();

哦,漏了node这个类了,在这里补一下,很简单。
通过Node类的两个方法, 来完成查找:
(Node是 Document 与 Element 的父接口)
方法1.
//根据路径表达式, 查找匹配的单个节点
Element e = selectSingleNode(“路径表达式”);
方法2.
//根据路径表达式, 将匹配路径的节点存入集合
List es = selectNodes(“路径表达式”);

3.API接入+XPATH:

String phone = "phoneNumber";
//1. 获取到XML资源的输入流
URL url = new URL("http://apis.juhe.cn/mobile/get?
phone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
//2. 创建一个XML读取对象
SAXReader sr = new SAXReader();
//3. 通过读取对象 读取XML数据,并返回文档对象
Document doc = sr.read(is);
Node node = doc.selectSingleNode("//company");
System.out.println("运营商:"+node.getText());
is.close();

4.用程序写一个XML文件:

案例:
//1. 通过文档帮助器, 创建空的文档对象
Document doc = DocumentHelper.createDocument();
//2. 向文档对象中, 加入根节点对象
Element root = doc.addElement("Demo");
//3. 向根节点中 丰富子节点
for(int i=0;i<5;i++) {
	//向根节点中加入5个节点.
	Element next= root.addElement("person");
	//向person节点, 加入id属性
	next.addAttribute("id", 1+i+"");
	//向person节点中加入name和sex节点
	Element name = next.addElement("name");
	Element info = next.addElement("sex");
	name.setText("张三"+i);
	sex.setText("男"+i);
}
//4. 创建文件的输出流
FileOutputStream fos = new FileOutputStream("c:\\books.xml");
//5. 将文件输出流 , 转换为XML文档输出流
XMLWriter xw = new XMLWriter(fos);
//6. 写出XML文档
xw.write(doc);
//7. 释放资源
xw.close();
System.out.println("代码执行完毕");

总结:

关于XML呢,我感觉了解一下就行了,因为现在大多数都用JSON,其实我也很矛盾(⊙﹏⊙),讲这么多最后只要了解就行。 但是虽然我们用的不多,万一有特殊需求呢,所以我们要知道有这个东西,用的时候再翻吗。关于JSON呢我会在下篇文章去讲解。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会代码的蛋蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值