1.XML文件的一些概念
1.1XML文件的常见应用
①数据传送的通用格式
②配置文件,例如程序的设置信息
③充当小型数据库
1.2XML的语法
①文档声明
<?xml version="1.0" encoding="utf-8" standalone="yes|no"?>
其中standalone="yes|no"表示该xml文件是否独立使用,yes表示是独立使用,no表示不是单独使用。默认是no
②一个xml文件,有且只有一个根元素
③在xml文件中
<name>xiaoming</name>
不等价与
<name>
xiaoming
</name>
④属性值用双引号(")或单引号(')分隔。如果属性值中有',则用"分隔;如果有",则用'分隔。
如果属性值既有'又有",则需要使用实体:
< | < |
> | > |
& | & |
" | " |
&apos | ' |
⑤CDATA节
有时我们希望传递一些特殊字符,如<>@!&,这时可以使用CDATA节
基本用法:
<![CDATA[
……
]]>
例如,可以使用xml去传递小图片(如头像等),将文件读取成byte[],然后放到CDATA节中,再传递。
2.使用dom4j操作XML文件
使用的xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<班级>
<学生>
<名字 别名="及时雨">宋江</名字>
<年龄>50</年龄>
<介绍>学习认真</介绍>
</学生>
<学生>
<名字 别名="玉麒麟">卢俊义</名字>
<年龄>53</年龄>
<介绍>学习认真</介绍>
</学生>
<学生>
<名字>林冲</名字>
</学生>
<学生>
<名字 别名="行者">武松</名字>
<年龄>53</年龄>
<介绍>学习认真</介绍>
</学生>
</班级>
2.1对xml进行CRUD操作
/**
* 使用dom4j对xml文件进行crud操作
*/
package com.hh.dom4j;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;
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 Dom4jTest {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//1.获得解析器
SAXReader saxReader = new SAXReader();
//2.指定解析哪个xml文件
Document document = saxReader.read(new File("src/com/hh/dom4j/myClass.xml"));
//传入document的根元素
list(document.getRootElement());
read(document);
add(document);
del(document);
update(document);
addByIndex(document);
}
//添加一个元素到指定位置(添加林冲在卢俊义之后,武松之前)
public static void addByIndex(Document document)throws Exception{
//创建一个元素
Element newHero = DocumentHelper.createElement("学生");
Element newHeroName = DocumentHelper.createElement("名字");
newHeroName.setText("林冲");
newHero.add(newHeroName);
//得到所有学生的list
List allHeros = document.getRootElement().elements("学生");
allHeros.add(2, newHero);
//更新xml
//直接输出会出现中文乱码,所以需要指定样式
OutputFormat output = OutputFormat.createPrettyPrint();
output.setEncoding("utf-8");//指定输出编码方式
//此时所有数据都在内存,并没有存入xml中,所以需要把xml文件更新
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/com/hh/dom4j/myClass.xml")),output);
writer.write(document);
writer.close();
}
//更新元素(把所有学生年龄增加3岁)
public static void update(Document document) throws Exception{
//得到所有学生的年龄
List<Element> students = document.getRootElement().elements("学生");
for(Element el:students){
//从el中取出年龄
int newAge = Integer.parseInt(el.element("年龄").getText()) + 3;
el.element("年龄").setText(newAge+"");
//修改属性,将别名都修改为hello
el.element("名字").addAttribute("别名2", "hello");
}
//更新xml
//直接输出会出现中文乱码,所以需要指定样式
OutputFormat output = OutputFormat.createPrettyPrint();
output.setEncoding("utf-8");//指定输出编码方式
//此时所有数据都在内存,并没有存入xml中,所以需要把xml文件更新
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/com/hh/dom4j/myClass.xml")),output);
writer.write(document);
writer.close();
}
//删除元素(删除第一个学生)
public static void del(Document document) throws Exception{
Element root = document.getRootElement();
//找到该元素
Element delStu = (Element)root.elements().get(0);
//从父节点删除该元素
// delStu.getParent().remove(delStu);
//删除介绍节点
Element delStu_nickName = delStu.element("介绍");
//方法一
delStu.remove(delStu_nickName);
//方法二
// delStu.element("介绍").getParent().remove(delStu.element("介绍"));
//删除名字元素的属性
// Element delStu_name = delStu.element("名字");
// delStu_name.remove(delStu_name.attribute("别名"));
//更新xml
//直接输出会出现中文乱码,所以需要指定样式
OutputFormat output = OutputFormat.createPrettyPrint();
output.setEncoding("utf-8");//指定输出编码方式
//此时所有数据都在内存,并没有存入xml中,所以需要把xml文件更新
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/com/hh/dom4j/myClass.xml")),output);
writer.write(document);
writer.close();
}
//添加元素(添加一个学生)
public static void add(Document document) throws Exception {
//首先创建一个学生节点对象
Element newStu = DocumentHelper.createElement("学生");
Element newStu_name = DocumentHelper.createElement("名字");
newStu_name.setText("刘德华");
newStu_name.addAttribute("别名", "德华");
Element newStu_age = DocumentHelper.createElement("年龄");
newStu_age.setText("35");
Element newStu_intro = DocumentHelper.createElement("介绍");
newStu_intro.setText("学习认真");
//把三个子元素(节点)加到newStu下
newStu.add(newStu_name);
newStu.add(newStu_age);
newStu.add(newStu_intro);
//再把newStu节点加到根元素
document.getRootElement().add(newStu);
//直接输出会出现中文乱码,所以需要指定样式
OutputFormat output = OutputFormat.createPrettyPrint();
output.setEncoding("utf-8");//指定输出编码方式
//此时所有数据都在内存,并没有存入xml中,所以需要把xml文件更新
// XMLWriter writer = new XMLWriter(new FileWriter("src/com/hh/dom4j/myClass.xml"),output);
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/com/hh/dom4j/myClass.xml")),output);
writer.write(document);
writer.close();
}
//指定读取某个元素(要求:读取第一个学生的信息)
public static void read(Document document){
//得到根元素
Element root = document.getRootElement();
//root.elements("学生")表示取出root元素下的所有学生元素List
//root.element("学生")表示取出root元素下第一个学生元素
//get(0)表示取出第一个学生元素
Element stu = (Element)root.elements("学生").get(0);
Element stu_name = stu.element("名字");
System.out.println(stu_name.getText());
//取出名字的属性
System.out.println(stu_name.attributeValue("别名"));
// System.out.println(((Element)stu.elements("年龄").get(0)).getText());
//dom4j不能直接跨层取数据,需要xpath
// Element name = (Element)root.elements("名字").get(0);
// System.out.println(name.getText());
//使用xpath,取出第二个学生
Element stu2 = (Element) document.selectSingleNode("/班级/学生[2]/名字");
System.out.println("第二个学生:"+stu2.getText());
}
//遍历整个xml文件
public static void list(Element element){
System.out.println(element.getName()+" "+element.getTextTrim());
Iterator iterator = element.elementIterator();
while(iterator.hasNext()){
Element e = (Element)iterator.next();
//递归
list(e);
}
}
}
//创建xml文件 public static void createXMLbyDOM4J() { Document document = DocumentHelper.createDocument(); //创建一个空白的xml文档 Element rootElement = document.addElement("employees"); //添加根节点 //添加employee节点并设置属性和值 Element employeeElement = rootElement.addElement("employee").addAttribute("id", "123"); //添加name节点并设置文本内容 employeeElement.addElement("name").addText("胡辉"); employeeElement.addElement("age").addText("23"); employeeElement.addElement("sex").addText("男"); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); employeeElement.addElement("birthday").addText(dateFormat.format(new Date())); //保存xml文档到硬盘 try { // 美化格式 OutputFormat format = OutputFormat.createPrettyPrint(); OutputStream out=new FileOutputStream("F:/employees.xml"); Writer wr=new OutputStreamWriter(out,"UTF-8"); XMLWriter writer = new XMLWriter(wr, format); writer.write(document); writer.close(); wr.close(); out.close(); } catch (Exception e) { e.printStackTrace(); } }
2.2dom4j结合xpath
单独使用dom4j是不能跨层取数据的,需要结合xpath才能实现。
/**
* dom4j配合xpath案例
*/
package com.hh.dom4j.xpath;
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 Test1 {
/**
* @param args
* @throws DocumentException
*/
public static void main(String[] args) throws DocumentException {
// TODO Auto-generated method stub
//1.得到SAXReader解析器
SAXReader saxReader = new SAXReader();
//2.指定去解析的文件路径
Document document = saxReader.read("src/com/hh/dom4j/xpath/test.xml");
//3.使用xpath随意读取xml
List e = document.selectNodes("/AAA/CCC/DDD/*");//返回多个元素 Element e = document.selectSingleNode()//返回一个元素
System.out.println(((Element)e.get(e.size()-1)).getText());
List e = document.selectNodes("/AAA/BBB[1]/CCC[2]/KKK");
System.out.println(((Element)e.get(0)).getText());
System.out.println(((Attribute)e.get(1)).getText());//输出属性值
}
}