文章目录
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文件解析 , 每当解析到一个标签的开始/结束/内容/属性时,触
发事件.
我们可以编写程序在这些事件发生时, 进行相应的处理.
优点:
分析能够立即开始,而不是等待所有的数据被处理
逐行加载,节省内存.有助于解析大于系统内存的文档
有时不必解析整个文档,它可以在某个条件得到满足时停止解析.
缺点:
- 单向解析,无法定位文档层次,无法同时访问同一文档的不同部分数据(因为逐
行解析, 当解析第n行是, 第n-1行已经被释放了, 无法在进行操作了). - 无法得知事件发生时元素的层次, 只能自己维护节点的父/子关系.
- 只读解析方式, 无法修改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呢我会在下篇文章去讲解。