JAVA基础-XML的解析(二)

三、XML的解析

XML的解析一共有2种方式:DOM解析:(DOM:Document Object Model)SAX解析:(Simple Api for XML)
    * DOM:文档对象模型。这种方式是W3C推荐的处理XML的一种方式。
    * SAX:这种方式不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都支持它。
  两者的解析方式的优缺点
    * DOM解析是一次把DOM树都加载到内存里进行解析,可以对其进行增删改,但是当解析的XML比较大的
时候可能会造成内存溢出。
    * SAX解析是以事件驱动的方式一行一行进行解析的,不会造成内存的溢出,但是不能对XML进行修改。
  针对这两种解析的方式,不同的公司提供了不同的API的实现
    * JAXP :SUN公司提供的一套XML的解析的API.
    * JDOM :开源组织提供了一套XML的解析的API-jdom.
    * DOM4J :开源组织提供了一套XML的解析的API-dom4j.
    * pull :主要应用在Android手机端解析XML.
  java中常用的API为DOM4J。

(一)DOM4J

DOM4J的常用的构造和方法:
    * 创建SAXReader对象:new SAXReader()
    * 设置读取路径返回Document对象对XML进行操作:
      reader.read(要读取XML的路径);
    * 创建OutputFormat对象设定输出格式: OutputFormat.createPrettyPrint()
    * 根据输出路径和输出格式创建输出对象:
      new XMLWriter(new FileOutputStream(输出路径, 输出格式);
  DOM4J的常用方法:
    * 获取根元素对象(根标签):
      返回值类型 - Element,调用对象 - Document getRootElement();
    * 获取所有的子元素:
      返回值类型 - List ,调用对象 - Element elements();
    * 根据指定的元素名称来获取相应的所有的子元素:
      返回值类型 - List ,调用对象 - Element elements(String name);
    * 根据指定的子元素名称,来获取子元素中的文本:
      返回值类型 - String ,调用对象 - Element elementText(String name);
    * 获取当前元素对象的文本:
      返回值类型 - String ,调用对象 - Element getText();
    * 设置当前元素对象的文本:
      返回值类型 - void ,调用对象 - Element setText(String text);
    * 添加当前元素对象的文本:
      返回值类型 - Element ,调用对象 - Element addText(String text);
    * 根据指定的属性名称获取其对应的值:
      返回值类型 - String ,调用对象 - Element attributeValue(String name);
    * 根据指定的属性名称和值进行添加或者修改:
      返回值类型 - Element ,调用对象 - Element addAttribute(String name,String value);
    * 删除某一元素(需父类对象删除子元素):
      返回值类型 - void ,调用对象 - Element remove(Element element);
    * 在目标节点中添加新的节点:
      返回值类型 - Element ,调用对象 - Element addElement(String name);
    * 创建一个新的元素对象:
      返回值类型 - Element,调用对象 - DocumentHelper DocumentHelper.createElement(String name);

(二)示例代码

* 目标XML文件:

 1 
 2 
 3 
 4 
 5 郑州
 6 高薪区
 7 
 8 普吉岛
 9 三门峡
10 安阳
11 南阳
12 北京
13 

工具类:

 1 public class Dom4jUtils {
 2 //私有构造
 3 private Dom4jUtils() {
 4 super();
 5 // TODO Auto-generated constructor stub
 6 }
 7 //创建Document对象
 8 public static Document creatDocument() throws Exception {
 9 SAXReader reader = new SAXReader();
10 Document document = reader.read("src\\com\\xmldemo\\city.xml");
11 return document;
12 }
13 //创建输出对象
14 public static void write(Document d) throws Exception {
15 OutputFormat format = OutputFormat.createPrettyPrint();
16 XMLWriter writer = new XMLWriter(new FileOutputStream("src\\com\\xmldemo\\city.xml"), format);
17 writer.write(d);
18 }
19 }

一顿操作:

 1 /**添加或修改属性,如果没有该属性就添加有的话就更新
  2 * @throws Exception
  3 */
  4 private static void method07() throws Exception {
  5 Document document = Dom4jTUtils.creatDocument();
  6 Element rootElement = document.getRootElement();
  7 //为根元素添加YY属性和值
  8 Element element = rootElement.addAttribute("YY", "你YY个啥劲儿");
  9 Dom4jTUtils.write(document);
 10 }
 11 
 12 /**打印某一节点的属性
 13 * @throws Exception
 14 */
 15 private static void method06() throws Exception {
 16 Document document = Dom4jTUtils.creatDocument();
 17 Element rootElement = document.getRootElement();
 18 //获取Name属性的值
 19 String value = rootElement.attributeValue("Name");
 20 System.out.println(value);
 21 }
 22 
 23 /**在某一标签位置添加新标签
 24 * @throws Exception
 25 */
 26 private static void method05() throws Exception {
 27 Document document = Dom4jTUtils.creatDocument();
 28 Element rootElement = document.getRootElement();
 29 // 创建一个新元素对象
 30 Element createElement = DocumentHelper.createElement("City");
 31 //为此元素设置值
 32 createElement.setText("普吉岛");
 33 //遍历
 34 List list = rootElement.elements();
 35 //将此节点加入到list集合的指定位置
 36 list.add(1, createElement);
 37 //写回
 38 Dom4jTUtils.write(document);
 39 }
 40 
 41 
 42 /**像某已指定元素添加元素
 43 * @throws Exception
 44 */
 45 private static void method04() throws Exception {
 46 Document document = Dom4jTUtils.creatDocument();
 47 Element rootElement = document.getRootElement();
 48 //在Root节点下添加一个新节点"City"
 49 Element addElement = rootElement.addElement("City");
 50 //为节点添加文本
 51 addElement.addText("北京");
 52 //写回
 53 Dom4jTUtils.write(document);
 54 }
 55 
 56 
 57 /**删除某一元素
 58 * @throws Exception
 59 */
 60 private static void methed03() throws Exception {
 61 Document document = Dom4jTUtils.creatDocument();
 62 Element rootElement = document.getRootElement();
 63 List list = rootElement.elements();
 64 //获取要删除元素的父元素(删除只能由父亲删除儿子)
 65 Element parent = list.get(2).getParent();
 66 //删除
 67 parent.remove(list.get(2));
 68 //将document写回
 69 Dom4jTUtils.write(document);
 70 }
 71 
 72 /**修改某一标签的文本
 73 * @throws Exception(为了方便抛出大的异常)
 74 */
 75 private static void medom02() throws Exception {
 76 Document document = Dom4jTUtils.creatDocument();
 77 Element rootElement = document.getRootElement();
 78 List list = rootElement.elements();
 79 //设置第三个元素的文本
 80 list.get(2).setText("青青草原");
 81 //使用工具类将document写回XML文档
 82 Dom4jTUtils.write(document);
 83 }
 84 
 85 /**获取第一个元素的Name属性
 86 * @throws Exception(为了方便抛出大的异常)
 87 */
 88 private static void method() throws Exception {
 89 //使用工具类创建Document对象
 90 Document document = Dom4jTUtils.creatDocument();
 91 //获得根节点
 92 Element element = document.getRootElement();
 93 //获得根节点下的所有元素节点
 94 List elements = element.elements();
 95 //获取第一个节点的Name属性文本
 96 String name = elements.get(0).elementText("Name");
 97 System.out.println(name);
 98 }
 99 
100 
101 /**用递归的方式遍历所有元素
102 * @param elements 根节点
103 */
104 public static void run(Element elements) {
105 //打印每个元素的名字
106 System.out.println(elements.getName());
107 //获取每个节点
108 List elements2 = elements.elements();
109 //递归调用
110 for (Element object : elements2) {
111 run(object);
112 }
113 }

欢迎加入学习交流群569772982,大家一起学习交流。

object : elements2) {111 run(object);112 }113 }

你可能感兴趣的:(JAVA基础-XML的解析(二))