文章目录
一、xml的解析
对xml进行读写操作
1.1 xml的解析方式(解析思想)
- dom
- sax
1.1.1 dom的解析方式
w3c标准–官方给的。
dom解析是将整个xml文档,分析成dom树,放入内存中。
优点: 可以操作任意一个节点。可以进行读写操作。
缺点: 如果文件比较大,会占用比较多的内存,效率低。还有可能引起内存溢出。
1.1.2 sax的解析方式 ((simple API for XML))
民间标准。
它是一种只能进行读操作的解析。
加载一行读取一行。
它是一种比较轻量级的解析方式。
优点: 读操作效率比较高。
缺点: 只能读,不能写,并且编程比较困难。
1.2 xml的解析包
前面说的是解析思想:dom sax
-
jaxp–sun官方提供的,比较滥。在javase中不需要导包(了解)包含在jdk中
-
dom4j(重点) 功能很强大(dom/sax)
Dom(sax和dom) for java -
Jdom
1.2.1 dom4j解析方式
dom4j要想使用首先要导入jar包。
在dom4j下有一个dom4j-1.6.1.jar文件,导入到我们的工程中。
- 获取一个解析器.
SAXReader reader = new SAXReader(); - 读取一个xml,获取对应的Document.
Document document = reader.read(new File(“books.xml”)); - 获取根元素.
Element root=document.getRootElement();
二、dom4j API 详解
2.1 方法
- elements()
得到所有的根元素下的所有子元素返回的是一个java.util.List对象。 - element(String name);
得到第一个元素下指定名称的子元素。
返回的是一个Element. - getText()
获取元素中的文本信息。 - DocumentHelper
这个是用来进行创建操作。
创建新元素
DocumentHelper.createElement(“type”) - add()
添加操作 - 添加属性
addAttribute(String name,String value);
如果属性存在,就是修改. - 获取属性
Element.attribute(String name); 返回的是一个Attribute对象 - 删除属性
Element.remove(Attribute a);
2.2 dom4j回写操作
XMLWriter writer = new XMLWriter(new FileWriter(file));
writer.write(document);
writer.close();
2.2.1 操作中会存在编码问题
原因: xml文件如果是utf-8,FileWriter它使用的编码是系统默认,如果是中文系统,使用的是gbk编码。
解决方案:
- XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(file),“utf-8”));
使用可以指定编码的字符流。 - 在dom4j中提供一个OutputFormat类,它可以指定编码。
OutputFormat format=OutputFormat.createPrettyPrint(); //有格式 format.setEncoding("utf-8");//指定编码 XMLWriter writer = new XMLWriter(new FileOutputStream(file),format); writer.write(document); writer.close();
2.2.2 代码演示
students.xml
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id="a1003C">
<name>李四</name>
<age>18</age>
<gender>female</gender>
</student>
<student id="a1003C">
<name>张三</name>
<age>18</age>
<gender>female</gender>
</student>
<student id="a1003C">
<name>张三</name>
<age>18</age>
<gender>female</gender>
</student>
</students>
1) 获取根元素
DemoTest
public class DemoTest {
public static void main(String[] args) throws Exception {
SAXReader reader = new SAXReader();
Document read = reader.read(new File("students.xml"));
Element root = read.getRootElement(); //获取根元素
System.out.println(root.getName());//得到跟元素的名称
}
}
2) 获取某个/所有元素下的子元素
DemoTest2
public class DemoTest2 {
public static void main(String[] args) throws Exception {
SAXReader reader = new SAXReader();
Document read = reader.read(new File("students.xml"));
Element root = read.getRootElement(); //获取根元素
// System.out.println(root.getName());
// Element stu = root.element("student");
// System.out.println(stu.getName());
List<Element> list = root.elements(); //获取根元素的所有子元素
System.out.println(list.size());
Element element = list.get(1);
Element name = element.element("name");
System.out.println(name.getText());
}
}
3) 添加一个带属性的节点,并将数据回写
public class DemoTest3 {
public static void main(String[] args) throws Exception {
SAXReader reader = new SAXReader();
Document read = reader.read(new File("students.xml"));
Element root = read.getRootElement();
List<Element> list = root.elements();
Element ce = DocumentHelper.createElement("address");
ce.setText("北京");
ce.addAttribute("id", "10");
list.get(1).add(ce);
//数据回写
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("students.xml")),OutputFormat.createPrettyPrint());
writer.write(read);
writer.close();
}
}
4) 修改某个节点的内容(节点的文本内容和属性值)
public class DemoTest4 {
public static void main(String[] args) throws Exception {
SAXReader reader = new SAXReader();
Document read = reader.read(new File("students.xml"));
Element root = read.getRootElement();
List<Element> list = root.elements();
Element student2 = list.get(1);
Element address = student2.element("address");
address.setText("天津");
address.addAttribute("id", "20");
//数据回写
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("students.xml")),OutputFormat.createPrettyPrint());
writer.write(read);
writer.close();
}
}
5) 删除某个节点
public static void main(String[] args) throws Exception {
SAXReader reader = new SAXReader();
Document read = reader.read(new File("students.xml"));
Element root = read.getRootElement();
List<Element> list = root.elements();
list.get(1).remove(list.get(1).element("address"));
//数据回写
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("students.xml")),OutputFormat.createPrettyPrint());
writer.write(read);
writer.close();
}