• 【学习笔记】关于DOM4J:使用DOM4J解析XML文档


    一、概述

    DOM4J是一个易用的、开源的库,用于XML、XPath和XSLT中。采用了Java集合框架并完全支持DOM、SAX、和JAXP。

    DOM4J最大的特色是使用大量的接口,主要接口都在org.dom4j这个包里定义:

    二、DOM4J的接口

    Attribute:定义了XML的属性;

    Branch:是能够包含子节点的节点,如XML元素(Element)和文档(Documents)定义了一个公共的行为;

    CDATA:定义了XML的CDATA区域;

    CharacterData:是一个标识接口,标致基于字符的节点:(CDATA、Comment、Text);

    Comment:定义了XML注释的行为;

    Document:定义了XML文档;

    DocumentType:定义了XML的DOCTYPE声明;

    Element:定义了XML文档;

    ElementHandler:定义了Element对象的处理器;

    ElementPath:被ElementHandler使用,用于取得当前正在处理的路径层次信息;

    Entity:定义XML的entity;

    Node:为所有的DOM4J中XML节点定义了多态行为;

    NodeFilter:定义了在DOM4J节点中产生的一个滤镜或谓词的行为(predicate);

    ProcessingInstruction:定义XML处理指令;

    Text:定义XML文本节点;

    Visitor:用于实现Visitor模式;

    XPath:在分析一个字符串后会提供一个XPath表达式。

    三、使用DOM4J操作XML数据

    1.Document对象相关

    读取XML文件,获得document对象。

    SAXReader reader = new SAXReader();

    Document document = reader.read(new File("input.xml"));

    2.节点相关

    获取文档的根元素

    Element rootElm = document.getRootElement();

    取得某节点的单个子节点

    Element memberElm = root.element("member");//"member"是节点名

    取得节点的文字

    String text = memberElm.getText();

    String text = root.elementText("name");//取得根元素下的name子节点的文字

    取得某节点下名为“member”的所有子节点并进行遍历

    List nodes = rootElm.elements("member");

    for(Iterator it=nodes.iterator;it.hasNext();){

      Element elm = (Element)it.next();

    }

    对某节点下的所有子节点进行遍历

    for(Iterator it = root.elementIterator();it.hasNext();){

      Element element = (Element) it.next();

    }

    在某节点下添加子节点

    Element ageElm = newMemberElm.addElement("age");

    设置节点文字

    ageElm.setText("29");

    删除某节点

    parentElm.remove(childElm);//childElm是待删除的节点,parentElm是其父节点

    3.相关属性

    取得某节点下的属性

    Element root = document.getRootElement();

    Attribute attribute = root.attribute("size");//属性名name

    取得属性的文字

    String text = attribute.getText();

    String text = root.element("name").attributeValue("firstname");

    遍历某节点的所有属性

    Element root = document.getRootElement();

    for(Iterator it = root.attributeIterator();it.hasNext();{

      Attribute attribute = (Attribute)it.next();

      String text = attribute.getText();

      System.out.println(text);

    }

    设置某节点的属性和文字

    newMemberElm.addAttribute("name","sitinspring");

    设置属性的文字

    Attribute attribute = root.attribute("name");

    attribute.setText("sitinspring");

    删除某属性

    Attribute attribute = root.attribute("size");

    root.remove(attribute);

    4.将文档写入XML文件

    (1)文档中全为英文,不设置编码格式,直接写入

    XMLWriter writer = new XMLWriter(new FileWriter("output.xml");

    writer.write(document);

    writer.close();

    (2)文档中含有中文,设置编码格式在写入

    OutputFormat format = OutputFormat.createPrettyPrint();

    format.setEncoding("GBK");

    XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);

    writer.write(document);

    writer.close();

    四、案例:使用DOM4J读取XML文档,步骤如下:

    1.导入DOM4J的jar包

    2.指定要解析的XML文件

    3.把XML文件转换成Document对象

    4.获取节点属性或文本的值

     1 import java.io.File;
     2 import java.util.Iterator;
     3 
     4 import org.dom4j.Document;
     5 import org.dom4j.DocumentException;
     6 import org.dom4j.Element;
     7 import org.dom4j.io.SAXReader;
     8 
     9 /**
    10  * 使用DOM4J解析XML文档
    11  * @author Administrator
    12  *
    13  */
    14 public class PhoneDom4j {
    15 
    16     public static void main(String[] args) {
    17         Document phone = null;
    18         try {
    19             //加载DOM树
    20             SAXReader saxReader = new SAXReader();
    21             phone = saxReader.read(new File("src/phoneInfo.xml"));
    22         } catch (DocumentException e) {
    23             e.printStackTrace();
    24         }
    25         //获取xml的根节点
    26         Element root = phone.getRootElement();
    27         //遍历所有的Brand标签
    28         for (Iterator<?> itBrand = root.elementIterator(); itBrand.hasNext();) {
    29             Element brand = (Element) itBrand.next();
    30             //输出标签的属性
    31             System.out.println("品牌:"+brand.attributeValue("name"));
    32             //遍历Type标签
    33             for (Iterator<?> itType = brand.elementIterator(); itType.hasNext();) {
    34                 Element type = (Element) itType.next();
    35                 //输出标签的name属性
    36                 System.out.println("	型号:"+type.attributeValue("name"));
    37             }
    38         }
    39 
    40     }
    41 
    42 }
  • 相关阅读:
    PPT幻灯片放映不显示备注,只让备注显示在自己屏幕上
    Available Date 相关
    App Store常用推广方法
    iPhone应用提交流程:如何将App程序发布到App Store-转
    [转]关于适配iphone5,Invalid Launch Image的退信
    NSLog 不打印中文 - 解决
    Xcode GDB 调试
    xcode找不到真机设备 - 转
    使用静态库的一些问题 -all_load
    [深入浅出iOS库]之图形库CorePlot
  • 原文地址:https://www.cnblogs.com/tengqiuyu/p/6890394.html
Copyright © 2020-2023  润新知