xml的解析、dom4j API 详解

文章目录

  • 一、xml的解析
    • 1.1 xml的解析方式(解析思想)
      • 1.1.1 dom的解析方式
      • 1.1.2 sax的解析方式 ((simple API for XML))
    • 1.2 xml的解析包
      • 1.2.1 dom4j解析方式
  • 二、dom4j API 详解
    • 2.1 方法
    • 2.2 dom4j回写操作
      • 2.2.1 操作中会存在编码问题
      • 2.2.2 代码演示
        • 1) 获取根元素
        • 2) 获取某个/所有元素下的子元素
        • 3) 添加一个带属性的节点,并将数据回写
        • 4) 修改某个节点的内容(节点的文本内容和属性值)
        • 5) 删除某个节点

一、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


<students> 
<student id="a1003C"> 
<name>李四name> 
<age>18age> 
<gender>femalegender> 
student> 
<student id="a1003C"> 
<name>张三name> 
<age>18age> 
<gender>femalegender> 
student> 
<student id="a1003C">
<name>张三name>
<age>18age>
<gender>femalegender>
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();
}

你可能感兴趣的:(JavaWeb学习笔记,xml,java)