xml的解析、dom4j API 详解

一、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文件,导入到我们的工程中。

  1. 获取一个解析器.
    SAXReader reader = new SAXReader();
  2. 读取一个xml,获取对应的Document.
    Document document = reader.read(new File(“books.xml”));
  3. 获取根元素.
    Element root=document.getRootElement();

二、dom4j API 详解

2.1 方法

  1. elements()
    得到所有的根元素下的所有子元素返回的是一个java.util.List对象。
  2. element(String name);
    得到第一个元素下指定名称的子元素。
    返回的是一个Element.
  3. getText()
    获取元素中的文本信息。
  4. DocumentHelper
    这个是用来进行创建操作。
    创建新元素
    DocumentHelper.createElement(“type”)
  5. add()
    添加操作
  6. 添加属性
    addAttribute(String name,String value);
    如果属性存在,就是修改.
  7. 获取属性
    Element.attribute(String name); 返回的是一个Attribute对象
  8. 删除属性
    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编码。
解决方案:

  1. XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(file),“utf-8”));
    使用可以指定编码的字符流。
  2. 在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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值