一.XML文档结构
首先,了解一下什么是XML文档,类似与Html的标签,但是标签名都是由自己定义的,XML是可扩展标记语言,用于存储数据,标签都是成对出现
<?xml version="1.0" encoding="UTF-8"?> <!-- 声明文档类型和字符编码 -->
<GenMulu><!-- 根目录 -->
<ZiMulu1 id = "1"> <!-- 子目录 属性需要使用“或‘包裹-->
<name>名字</name> <!-- 存储的数据 -->
<age>年龄</age>
</ZiMulu1>
<ZiMulu1 id = "2">
<name>名字2</name>
<age>年龄2</age>
</ZiMulu1>
</GenMulu>
XML文档常用于数据传输,具有跨平台性
二.使用Dom4j创建XML文档
首先下载Java拓展的jar包
//这个是dom4j的jir包
链接:https://pan.baidu.com/s/10YGDU3IBsW3jOvGFiE5sPA
提取码:2022
直接上代码:
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4j创建 {
public static void main(String[] args) {
// 船舰document的文档对象
Document doc = DocumentHelper.createDocument();
//创建根节点
Element element = DocumentHelper.createElement("herolist");
doc.setRootElement(element);
//创建子节点
Element hero = DocumentHelper.createElement("hero");
hero.addAttribute("id", "001");
element.add(hero);
//子节点里面的子节点
Element name = DocumentHelper.createElement("name");
name.setText("亚瑟");
hero.add(name);
Element sex = DocumentHelper.createElement("sex");
sex.setText("男");
hero.add(sex);
Element price = DocumentHelper.createElement("price");
price.setText("13888");
hero.add(price);
Element hero2 = DocumentHelper.createElement("hero");
hero2.addAttribute("id", "002");
element.add(hero2);
Element name1 = DocumentHelper.createElement("name");
name1.setText("程咬金");
hero2.add(name1);
Element sex1 = DocumentHelper.createElement("sex");
sex1.setText("男");
hero2.add(sex1);
Element price1 = DocumentHelper.createElement("price");
price1.setText("13888");
hero2.add(price1);
OutputFormat ou = OutputFormat.createPrettyPrint(); //输出格式化,使用美丽的方式输出,就是输出的是适合你看的,输入create另外两个选项可以试一下
ou.setEncoding("GBK");//定义的输出格式,eclipse的默认是GBK
try {
XMLWriter xmls = new XMLWriter(new FileWriter("英雄列表2.xml"),ou);//输出流进行输出,两个参数分别是输出的地址和输出格式化
xmls.write(doc);//输出
xmls.flush();//清空缓存区
xmls.close();//关闭资源
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
成果:
<?xml version="1.0" encoding="GBK"?>
<herolist>
<hero id="001">
<name>亚瑟</name>
<sex>男</sex>
<price>13888</price>
</hero>
<hero id="002">
<name>程咬金</name>
<sex>男</sex>
<price>13888</price>
</hero>
</herolist>
总结一下:
就是创建代表总体的Document对象,然后创建节点,设置根节点,在根节点下设置子节点,子节点设置属性,内容或者在子节点内设置孙节点,孙节点内设置曾孙节点。。。
注意将字节点添加到父节点时,不要添加错了地方
三. 使用Dom4j解析XML文档
直接上代码:
import java.io.File;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4j解析 {
public static void main(String[] args) {
SAXReader reader = new SAXReader();//创建XML的输入流
try {
//读取整个XML文档,创建Document对象,Document对象一般表示整个XML文档
Document dou = reader.read(new File("D:\\储存\\eclipse储存\\JavaGaoJi\\src\\demo5\\英雄列表.xml"));
//根据Document对象获取根节点对象
Element element = dou.getRootElement();
//自己定义一个递归方法,用于获取全部的数据
//递归就是在方法体内调用方法本省,理论上循环能干的事情,递归也能干,但是递归的速度较慢
list(element);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void list(Element e) {
//输出节点名称
System.out.print("<"+e.getName()+" ");
//获取全部的数据,使用list集合保存
List<Attribute> attribute = e.attributes();
//循环获取全部的属性并输出
Attribute att = null;
for(int i=0;i<attribute.size();i++) {
att = attribute.get(i);
System.out.print(att.getName()+"="+att.getValue()+" ");
}
System.out.println(">"); //到这里也就表示一个节点的开头写完了
//判断这个节点中是否有数据,有的话则进行输出
//e.getTextTrim()这个方法和e.getText()的区别是不会将空格和换行符算入数据中
if(!e.getTextTrim().equals("")) {
System.out.println(e.getText());
}
//获取该节点的全部字节点,使用Iterator进行保存,方便递归
Iterator<Element> as = e.elementIterator();
//循环读取该节点中的全部信息
while(as.hasNext()) {//hasNext()判断该对象是否还有内容
Element el = as.next(); //读取下一个内容
list(el); //递归
}
//当递归到最后的时候,在返回来,就会输出每一个节点的尾标签
System.out.println("< /"+e.getName()+">");//递归完后进行输出
}
}
递归简洁而言就是在方法内调用该方法,一直到最后全部的节点都被访问过后在结束
运行结果:
四 . Xpath路径语言
简介:Xpath用于确认XML文档中某部分的位置的语言
照常的先下载相应的jar包
链接:https://pan.baidu.com/s/1oxM6e_i-vle7uuEMghvOQg
提取码:2022
常用的表达式:
- / 从根节点选取
- // 从匹配选择的当前节点,选择文档中的节点,不考虑他们的位置
- . 选取当前节点的父节点
- @ 选取属性
常用谓语:
- /note/info[1] 选取属于note元素的第一个info元素
- /note/info[last()] 选取note元素的最后一个info元素
- //info[@id] 获取所有属性名为id的info元素
- info[@id=‘2’] 获取所有属性名为id且值为2的info元素
- /note/info[price>5] 选取note节点下的所有的info元素,且其子元素的price的值必须大于5
上代码:
import java.io.File;
import java.util.List;
import org.dom4j.*;
import org.dom4j.io.*;
public class Xpath路径语言 {
public static void main(String[] args) {
//创建SAXReader对象
SAXReader sax = new SAXReader();
try {
Document doc = sax.read(new File("D:\\储存\\eclipse储存\\Java高级程序设计\\src\\第五章XML\\booksss.xml"));
List<Node> list = doc.selectNodes("/books");//获取根节点。。。
for(int i=0;i<list.size();i++) {
System.out.println(list.get(0).getName());
}
List<Node> lis = doc.selectNodes("//boo[@id='2']");
for(int i=0;i<lis.size();i++) {
System.out.println(lis.get(0).getStringValue());
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<books id = "3">
<book id="1">一二三四五</book>
<boo id="2">上山打老斧</boo>
</books>
输出结果: