/*在学习Java的过程中,一直有一个东西让我捉摸不透,这就是XML文件
XML文件是如何调用的?
语法规则是什么?
怎么使用XML?
数据流的产生等.........
然后,一气之下,花一天时间,搞定这个XML文件吧。
*/
实体类
JavaBean有特定的写法
一般用来和数据库字段做映射ORM:
id | name | age | address |
---|---|---|---|
1 | 薛之谦1 | 22 | 江苏 |
2 | 薛之谦2 | 21 | 北京 |
//表格对应的实体类
class People(){
private int id;
private String name;
private int age;
private String address;
}
class A{
People p1 = new People(3,“薛之谦3”,33,“杭州”);
}
id:
姓名:
年龄:
地址:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2936GOdz-1602751358195)(C:\Users\18130\AppData\Roaming\Typora\typora-user-images\image-20201015091311722.png)] – 作用范围
ml = mark language
单片机游戏的作用
1、存储数据:比如手机中的游戏装备、等级等 |
---|
2、传文件:大型的应用网络使用xml,网络上传递数据 |
3、配置文件:* properties,* .xml |
1、平台无关性
2、90%的语言都支持XML4
3、xml文件的标签具有自我描述性
1、必须得有根元素
2、标签必须得闭合
3、对大小写敏感
4、必须得正确嵌套
5、属性必须加引号
<ban>
<xuesheng>
<id>1id>
<name>张三name>
xuesheng>
<xuesheng>
<id>2id>
<name>李四name>
xuesheng>
ban>
<family>
<name>孙悟空name>
<age>500age>
<jon>保镖jon>
member>
<name>猪八戒name>
<age>500age>
<jon>保镖jon>
member>
family>
在xml中书写特殊符号包错,则使用
<xx> <xx>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2vvxk3LX-1602751358197)(C:\Users\18130\AppData\Roaming\Typora\typora-user-images\image-20201015141359446.png)]
这个 dtd (Document Type Definition)文件用来固定数据类型,也可以自己写一个 dtd 文件 :
(所以如果你看不懂Mybatis中的XML文档的话,只需要百度一下mybatis-3-mapper.dtd)
< ?xml version ="1.0" encoding="UTF-8">
< !DOCTYPE students SYSTEM 'fileName.dtd'>
<Students>
<student>
<name>张三name>
<age>20age>
student>
Students>
– 已经定义的标签以及子标签,好比 student 中有子标签 name 和 age 但是在 xml 文件中不写 name 和 age 的话会报错。
//由于内容与dtd文件一样不需要掌握,且代码较为复杂,所以这里不放代码,有需要的话可以百度xsd文件规范
解析 XML 文件的四种方式:
方式 | 性能 | 原理 | 优点 | 缺点 |
---|---|---|---|---|
1、DOM解析 | 3 | 把文档中的所有元素按照出现层次列成树状结构 | 可以遍历 & 修改节点内容。 | 内存压力大,解析慢。 |
2、SAX解析 | 第2 | 是xml的解析替代方法 | 相对dom更快 更 有效 | 不能修改节点内容 |
3、JDOM解析 | 3 | 仅适用具体的类,不用接口 | 不灵活 | |
4、DOM4J解析 | 最好 | JDOM的一种只能分值,合并了许多超出基本XML文档的功能 | 著名的框架hibernate |
//前两种属于基础方法,是官方提供的与平台无关的解析方式;
//后两种属于扩展方法,他们是在基础方式上扩展出来的,只适用于java平台。
public static void main(String[] args) throws Element{
// 1 --加载xml文件到jvm中,形成数据流
InputStream fileStream =TestXml.class.getResourceAsStream("test4.xml");
// 2 --创建解析对象
SAXReader sax = new SAXReader();
// 3 --获得整个Xml文档对象
Document doc = sax.read(fileStream);
// 4 -- 一层一层的读取元素
//4.1 -- 获得根元素
Element root = doc.getRootElements();
// 4.2 -- 获得根元素下的所有子元素
List list = root.elements();
for(Element e1 : list){
List<Element> list2 = e1.getName();
for(Element e2 : list2){
System.out.println(e2.getName() + ":" + e2.getData());
}
}
//获取数据类型
for (Element e1 : list) {
Attribute type = e1.attribute("type");
}
}
public static void main(String[] args) throws Element{
// 1 --加载xml文件到jvm中,形成数据流
InputStream fileStream =TestXml.class.getResourceAsStream("test4.xml");
// 2 --创建解析对象
SAXReader sax = new SAXReader();
// 3 --获得整个Xml文档对象
Document doc = sax.read(fileStream);
// 4 -- 一层一层的读取元素
//4.1 -- 获得根元素
Element root = doc.getRootElements();
Element student = root.addElement("student");
Element id = student.addElement("id");
id.setText("3");
Element id = student.addElement("name");
id.setText("薛之谦");
Element id = student.addElement("age");
id.setText("30");
//写入XML文件中
FileOutputStream out = new FileOutputStream("");
OutputFormat format = new OutputFormat("\t",true,"UTF-8");
XMLWriter xw = new WMLWriter(out,format);
//将整个文档写入到文件中
xw.write(doc);
System.out.println("写入成功");
xw.close();
}
一般的便利方式:
使用xpath需要引包:jaxen-1.1-beta-7.jar
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K2Fg7m8L-1602751358199)(C:\Users\18130\AppData\Roaming\Typora\typora-user-images\image-20201015163321373.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pLITH0hz-1602751358201)(C:\Users\18130\AppData\Roaming\Typora\typora-user-images\image-20201015163718356.png)]
创建 xml文件,其中有三个Student,每个学生的属性是:name,age
/* // 1 --加载xml文件到jvm中,形成数据流
InputStream fileStream =TestXml.class.getResourceAsStream("test4.xml");
// 2 --创建解析对象
SAXReader sax = new SAXReader();
// 3 --获得整个Xml文档对象
Document doc = sax.read(fileStream);
// 4 -- 一层一层的读取元素
//4.1 -- 获得根元素
Element root = doc.getRootElements();*/
//获得所有的学生
List<Element> list = root.selectNodes("student");
//获取所有的学生的名字
List<Element> name = root.selectNodes("student/name");
//获得第一个学生
List<Element> name = root.selectNodes("student[1]");
//获取所有带有type属性的学生
List<Element> name = root.selectNodes("student[@type]/name");
//获取带有type = c 的学生
List<Element> name = root.selectNodes("student[@type='c']/name");
//获得年龄超过20岁的学生
List<Element> name = root.selectNodes("student[age>20]/name");
//获取倒数第二个学生的名字
//全部打印
list.forEach( S -> System.out.println());
list.forEach(System.out::println());