XML&JSON XML简介: XML是跨平台的语言,它不需要安装任何环境的语言, 它是所有语言所共有的,单独的语言,并且不是所有语言内部的。 它是让所有语言去和xml交互 。 注意: html前身是xml
<></>(整体)这就是标记(标签) 注意点: 标签可以随便写(自定义不会报错),所以叫可扩展。 ==》不像Java 很严格。
< head> </ head >标记语言
注意点: 自定义的标签也不会报错
1.XML定义: 可扩展标记语言(1.标记 2.可扩展) Extensible Markup Language
2.特点: 1.1 XML于操作系统、开发平台无关 1.2 实现不同系统间的数据交换
3.作用: 1.1 数据交互 1.2 配置应用程序 1.3 Ajax基石(基于XML)
4.文档结构 1.1创建XML 创建一个文档后缀名为xml, (xml大小写没有严格的区分,Java有) 然后打开,把第一句话写上去,这样才算是xml,不然不是。
1.2查询/编辑(Design/Source)
1.3工程里创建xml 右击—New—other—XML File
注意点: Java去解析xml的代码,但没有工具。 xml代码只有编译测试,没有运行测试。
1.4内容介绍: <?xml version="1.0" encoding="UTF-8"?> --》 声明
如下的都是 --》文档元素描述信息(文档结构)
<books>
<books/>
//注释
<books id="1">
<author>冰心</author>
<name>爱情</name>
</books>
</books>
注意点: xml在eclipse运行不了 ,有波浪线不代表报错, 只是eclipse认为错,但Java可以。
5.文档标签 一层一层嵌套是父子关系,必须要有父亲(根节点)。
1.1 XML标签 XML文档内容有一系列标签元素组成 <元素名 属性名 = “属性值”>元素内容</元素名>
注意点: 属性值最好需要配值 没有取值 会编译报错 但没事 不算错 和Java不一样,但最好有值,因为可以对应匹配。
空元素: (常见第二种)
<name> </name>
<name></name>
<name/>
注意点: 1.属性值用双引号包裹(单引号也可以 但不建议) 2.一个元素可以有多个属性 3.属性值中不能直接包含 <、“、& 4.属性值中不建议使用的字符:‘ 、>
6.XML编写注意事项 1.所有XML元素都必须有结束标签 2.XML标签对大小写敏感 3.XML必须正确的嵌套 4.同级标签以缩进对齐 (没有缩进的话 是不标准的xml但不是错的。) 5.元素名称可以包含字母、数字或其他的字符 6.元素名称不能以数字或者标点符号开始 7.元素名称中不能含空格 (建议 用英文)
7. 转义符
< <
> >
给我们看的 并不是真正的大于小于
“ "
‘ '
& &
–》 一般是在属性值上使用
<![CDATA[ ]]> -- 》 一般是在两个标签中间使用 (文本)
8. 案例实现 1.1 案例1:将如下衣服的尺码信息,使用XML文件保存
<?xml version="1.0" encoding="UTF-8"?>
<clothSize>
<size range="height<165">s</size>
<size range="165<height<170">M</size>
<size range="170<height<175">L</size>
<size range="175<height<180">XL</size>
<size range="180<height<185">XXL</size>
<size range="height>185">XXXL</size>
</clothSize>
1.2 案例2:编写XML表示学生成绩
<?xml version="1.0" encoding="UTF-8"?>
<studentScores>
<studnent name = "xz" expectedScore = "75"
actualScore = "80"></studnent>
<studnent name = "xl" expectedScore = "75"
actualScore = "88"></studnent>
<student>
<name>xz</name>
<expectedScore>75</expectedScore>
<actualScore>80</actualScore>
</student>
<student>
<name>xl</name>
<expectedScore>75</expectedScore>
<actualScore>88</actualScore>
</student>
</studentScores>
9.解析XML
9.1 DOM 特点: 把文档解析成文档树
9.2 SAX(不常用)
9.3 DOM4J(常用)解析案例 特点: 将DOM解析进行了一次封装
9.3.0常用API
Document接口:定义XML文档
Element接口:定义XML元素
Text接口:定义XML本文节点
Attribute接口:定义XML属性
9.3.1准备环境 (1)前提(准备物料dom4j-1.6.1.jar包) 将工程所有设置配置成utf-8,并导入jar包,并手工创建XML文件 1.在工程里创建一个lib-Folder 2.从外部导入dom4j-1.6.1.jar包 3.然后右击Build Path- Add to Build Path 生成本工程的一个引用库下的包(外部类库) 4.创建Dem4jXMLjava文件
9.3.2 加载DOM树
5.写个loadXML方法
/**
* 1.加载DOM树
*/
Document doc = null;// 全局 变量
public void loadXML() {
//1.实例化SAXReader对象(读取)
SAXReader saxReader = new SAXReader();
import org.dom4j.io.SAXReader; 导包
try {//引入read方法,去读取xml
doc = saxReader.read("src\\A.xml")
import org.dom4j.Document; 导包
import org.dom4j.DocumentException; 导包
System.out.println(doc);
//测试有没有这个xml
//加载xml成功,能打印出来,就能加载到我们的工程里
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
结果: 地址.DefaultDocument@1fb3ebeb [Document: name src\A.xml]
6.main方法
public static void main(String[] args) {
Dem4jXML dem4jXML = new Dem4jXML();
dem4jXML.loadXML();
//dem4jXML.addXML();
//dem4jXML.updateXML();
dem4jXML.delete();
dem4jXML.findXML();
}
题外话: 查看saxReader.read的源码, 需要导包dom4j_src (关联源码), 但有没有这个不影响重要的是jar包。 attach Source – External location – External Folder
9.3.3 需求1(显示手机收藏信息)
/**
* 2.查询XML
*/
public void findXML() {//Dem4jXML特有的Iterator
//1.调用getRootElement()获取根元素
Element root = doc.getRootElement();
import org.dom4j.Element;导包
//2.遍历儿子元素的集合
Iterator brandInfos = root.elementIterator();
import java.util.Iterator; 导包
while(brandInfos.hasNext()) {
//3.获取儿子元素
Element brandInfo = (Element)brandInfos.next();
System.out.println(brandInfo.attributeValue("name"));
(得 儿子元素节点得name属性值)
//4.遍历孙子元素(获取孙子节点对象)
Iterator types = brandInfo.elementIterator();
while(types.hasNext()) {//(获取孙子元素节点)
Element type = (Element)types.next();
System.out.println(type.attributeValue("name"));
}
}
}
结果: 华为 Mate50 pro p50 pro nova 6 苹果 iphone12 pro
9.3.4 需求2(为手机收藏信息添加新的节点)
/**
* 3. 添加节点
*/
public void addXML() {
//1.获取根元素
Element root = doc.getRootElement();
//2.添加儿子元素
Element brandInfo = root.addElement("Brand");
//3.给儿子元素添加name属性
brandInfo.addAttribute("name", "三星");
//4.添加孙子节点
Element type = brandInfo.addElement("Type");
//5.给孙子元素添加name属性
type.addAttribute("name", "note8 pro");
//以上添加节点在xml显示不出来,所以才有了方法saveXML
//6.保存(数据)到新的xml中
saveXML("src\\b.xml");//调用saveXML方法
}
9.3.5 需求3(保存手机收藏信息写出到xml文件)
/**
* 4.保存到XML
*/
public void saveXML(String path) {
//1.调用OutputFormat类的createPrettyPrint()
OutputFormat format = OutputFormat.createPrettyPrint();
//对获取的内容格式化一下 比如输出的 样式 以及字符集
import org.dom4j.io.OutputFormat; 导包
//2.设置字符集
format.setEncoding("utf-8");
//3.创建输出对象
XMLWriter writer = null;
import org.dom4j.io.XMLWriter; 导包
//4.调用对象
try {
writer = new XMLWriter(new FileWriter(path),format);
//字节输出流 设置字符集
//XMLWriter 依赖于 FileWriter写出的 本身没有自己的写出方法
//第二个 format一样的解释 XMLWriter 没有自己的格式化方法
import java.io.FileWriter; 导包
//5.输出给文件(写出数据)
writer.write(doc);
import java.io.IOException; 导包
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//6.关闭writer流对象
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意点: 1.要刷新(在工程下) Refalsh 2.最好全是UTF-8 或者GBK,要统一(xml文件和工程),不然会有乱码 3.java机制 先编译后运行
9.3.5 需求4(修改手机收藏信息节点)
/**
* 5.修改XML(修改要把增加屏蔽掉)
*/
public void updateXML() {
//1.获取根元素
Element root = doc.getRootElement();
//2.获取儿子元素的集合
Iterator brandInfos = root.elementIterator();
//3.定义变量id
int id = 0;
//4.循环遍历儿子元素集合
while(brandInfos.hasNext()){
Element brand = (Element)brandInfos.next();
id++;
brand.addAttribute("id", id+"");
}
saveXML("src\\c.xml");
}
9.3.6 需求5(删除品牌为“苹果”的手机)
/**
* 删除节点(屏蔽掉添加和修改)
*/
public void delete() {
//1.获取根元素
Element root = doc.getRootElement();
//2.获取儿子元素的集合
Iterator brandInfos =root.elementIterator();
//3.遍历儿子元素集合
while(brandInfos.hasNext()) {
//4.获取儿子元素
Element brand = (Element)brandInfos.next();
if(brand.attributeValue("name").equals("苹果")) {
brand.getParent().remove(brand);
}//getParent() 获取父节点
// 判断儿子节点的名称是苹果,则删除对应的父子节点
}
saveXML("src\\d.xml");//刷新本工程才能出来
}
题外话: mysql -uroot -pok -u的含义是 ----->user用户的意思 使用root超级用户管理员的身份 -p的含义是-------->password的意思 使用ok作为本机mysql数据库的密码 虚拟机: mysql -h 虚拟机的ip地址 -uroot -pok
----2021.8.31&9.01&9.02
|