XML--04--解析-DOM4J 和 JDOM

DOM4J方式

  • dom4j是一个Java的第三方类库 XML API,类似于jdom,用来读写XML文件的。用于处理 XML、 XPath 和 XSLT,它基于 Java 平台,使用 Java 的集合框架,全面集成了 DOM,SAX 和 JAXP

  • 对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。

一、DOM4j中,获得Document对象的方式有三种:

1.读取XML文件,获得document对象
SAXReader reader = new SAXReader();
Document document = reader.read(new File(“csdn.xml”));
2.解析XML形式的文本,得到document对象.
String text = “”;
Document document = DocumentHelper.parseText(text);
3.主动创建document对象.
Document document = DocumentHelper.createDocument(); //创建根节点
Element root = document.addElement(“csdn”);

二、节点对象操作的方法

1.获取文档的根节点.
      Element root = document.getRootElement();
    2.取得某个节点的子节点.
      Element element=node.element(“四大名著");
    3.取得节点的文字
        String text=node.getText();
    4.取得某节点下所有名为“csdn”的子节点,并进行遍历.
       List nodes = rootElm.elements("csdn"); 
         for (Iterator it = nodes.iterator(); it.hasNext();) {   
	  Element elm = (Element) it.next();  
  	// do something
 }
     5.对某节点下的所有子节点进行遍历.    
      for(Iterator it=root.elementIterator();it.hasNext();){      
        Element element = (Element) it.next();      
       // do something 
 }
    6.在某节点下添加子节点
      Element elm = newElm.addElement("朝代");
    7.设置节点文字.  elm.setText("明朝");
    8.删除某节点.//childElement是待删除的节点,parentElement是其父节点  parentElement.remove(childElment);
    9.添加一个CDATA节点.Element contentElm = infoElm.addElement("content");contentElm.addCDATA(“cdata区域”);

三、节点对象的属性方法操作

1.取得某节点下的某属性    Element root=document.getRootElement();        //属性名name
         Attribute attribute=root.attribute("id");
    2.取得属性的文字
	String text=attribute.getText();
    3.删除某属性 Attribute attribute=root.attribute("size"); root.remove(attribute);
    4.遍历某节点的所有属性   
      Element root=document.getRootElement();      
       for(Iterator it=root.attributeIterator();it.hasNext();){        
           Attribute attribute = (Attribute) it.next();         
           String text=attribute.getText();        
           System.out.println(text);  
  }
    5.设置某节点的属性和文字.   newMemberElm.addAttribute("name", "sitinspring");
    6.设置属性的文字   Attribute attribute=root.attribute("name");   attribute.setText("csdn");

四、将文档写入XML文件

1.文档中全为英文,不设置编码,直接写入的形式.  
       XMLWriter writer = new XMLWriter(new  FileWriter("ot.xml")); 
       writer.write(document);  
       writer.close();
    2.文档中含有中文,设置编码格式写入的形式.
       OutputFormat format = OutputFormat.createPrettyPrint();// 创建文件输出的时候,自动缩进的格式                  
       format.setEncoding("UTF-8");//设置编码
       XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);
       writer.write(document);
       writer.close();

五、字符串与XML的转换

1.将字符串转化为XML
      String text = "<csdn> <java>Java班</java></csdn>";
      Document document = DocumentHelper.parseText(text);
    2.将文档或节点的XML转化为字符串.
       SAXReader reader = new SAXReader();
       Document   document = reader.read(new File("csdn.xml"));            
       Element root=document.getRootElement();    
       String docXmlText=document.asXML();
       String rootXmlText=root.asXML();
       Element memberElm=root.element("csdn");
       String memberXmlText=memberElm.asXML();

案例

第一步:在pom.xml中导入dom4j对应的jar

<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>1.6.1</version>
</dependency>

第二步:在sida.xml描述四大名著的操作,文件内容如下

在这里插入图片描述

解析xml文件

实现步骤:

第一步:创建一个SAXReader解析器

SAXReader reader = new SAXReader();

第二步:解析xml文件,重新构建成一个Document对象

Document document = reader.read(new File(“src\sida.xml”));

第三步:处理Document对象信息,在控制台打印

 @Test
    public void test() throws Exception {

        // 创建saxReader对象
        SAXReader reader = new SAXReader();
        // 通过read方法读取一个文件 转换成Document对象
        Document document = reader.read(new File("src\\main\\resources\\mapper\\sida.xml"));
        //获取根节点元素对象
        Element node = document.getRootElement();
        //遍历所有的元素节点
        listNodes(node);
  )
  /**
     * 遍历当前节点元素下面的所有(元素的)子节点
     *
     * @param node
     */
    public void listNodes(Element node) {
        System.out.println("节点名:  <" + node.getName()+">");
        // 获取当前节点的所有属性节点
        List<Attribute> list = node.attributes();
        // 遍历属性节点
        for (Attribute attr : list) {
            System.out.println(attr.getText() + "-----" + attr.getName()
                    + "=" + attr.getValue());
        }

        if (!(node.getTextTrim().equals(""))) {
            System.out.println("文本内容:" + node.getText());
        }

        // 当前节点下面子节点迭代器
        Iterator<Element> it = node.elementIterator();
        // 遍历
        while (it.hasNext()) {
            // 获取某个子节点对象
            Element e = it.next();
            // 对子节点进行遍历
            listNodes(e);
        }
    }

在这里插入图片描述

dom4j 生成 xml

实现步骤:

第一步:创建一个Document实例

Document doc = DocumentHelper.createDocument();

第二步:先添加一个根结点,然后再添加子结点,构造成一个树形结构

Element root = doc.addElement(“root”);

第三步:添加xml文件样式(也可自定义样式),并输出xml文件到指定的路径下

OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileOutputStream(file), format);
writer.write(doc);

案例:

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import java.io.*;

public class CreateDom4j {


    public static void main(String[] args) {
        // 执行dom4j生成xml方法
        createDom4j(new File("src\\main\\resources\\mapper\\dom4j.xml"));
    }

    public static void createDom4j(File file) {
        try {
            // 创建一个Document实例
            Document doc = DocumentHelper.createDocument();

            // 添加根节点
            Element root = doc.addElement("root");

            // 在根节点下添加第一个子节点
            Element oneChildElement= root.addElement("person").addAttribute("attr", "root noe");
            oneChildElement.addElement("people")
                    .addAttribute("attr", "child one")
                    .addText("person one child one");
            oneChildElement.addElement("people")
                    .addAttribute("attr", "child two")
                    .addText("person one child two");

            // 在根节点下添加第一个子节点
            Element twoChildElement= root.addElement("person").addAttribute("attr", "root two");
            twoChildElement.addElement("people")
                    .addAttribute("attr", "child one")
                    .addText("person two child one");
            twoChildElement.addElement("people")
                    .addAttribute("attr", "child two")
                    .addText("person two child two");

            // xml格式化样式
            // OutputFormat format = OutputFormat.createPrettyPrint(); // 默认样式

            // 自定义xml样式
            OutputFormat format = new OutputFormat();
            format.setIndentSize(2);  // 行缩进
            format.setNewlines(true); // 一个结点为一行
            format.setTrimText(true); // 去重空格
            format.setPadText(true);
            format.setNewLineAfterDeclaration(false); // 放置xml文件中第二行为空白行

            // 输出xml文件
            XMLWriter writer = new XMLWriter(new FileOutputStream(file), format);
            writer.write(doc);
            System.out.println("dom4j CreateDom4j success!");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


}

在这里插入图片描述

修改xml结构:

    @Test
    public void test() throws Exception {

        // 创建saxReader对象
        SAXReader reader = new SAXReader();
        // 通过read方法读取一个文件 转换成Document对象
        Document document = reader.read(new File("src\\main\\resources\\mapper\\sida.xml"));
        //获取根节点元素对象
        Element node = document.getRootElement();


        // 获取四大名著元素节点中,子节点名称为红楼梦元素节点。
        Element element = node.element("红楼梦");
        //获取element的id属性节点对象
        Attribute attr = element.attribute("id");
        //删除属性
        element.remove(attr);
        //添加新的属性
        element.addAttribute("name", "作者");
        // 在红楼梦元素节点中添加朝代元素的节点
        Element newElement = element.addElement("朝代");
        newElement.setText("清朝");
        //获取element中的作者元素节点对象
        Element author = element.element("作者");
        //删除元素节点
        boolean flag = element.remove(author);
        //返回true代码删除成功,否则失败
        System.out.println(flag);
        //添加CDATA区域
        element.addCDATA("红楼梦,是一部爱情小说.");


    }

在这里插入图片描述

字符串与XML互转换案例

package dom4j;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
 
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
 
public class Demo02 {
 
	@Test
	public void test() throws Exception {
 
		// 创建saxreader对象
		SAXReader reader = new SAXReader();
		// 读取一个文件,把这个文件转换成Document对象
		Document document = reader.read(new File("src//c.xml"));
		// 获取根元素
		Element root = document.getRootElement();
		// 把文档转换字符串
		String docXmlText = document.asXML();
		System.out.println(docXmlText);
		System.out.println("---------------------------");
		// csdn元素标签根转换的内容
		String rootXmlText = root.asXML();
		System.out.println(rootXmlText);
		System.out.println("---------------------------");
		// 获取java元素标签 内的内容
		Element e = root.element("java");
		System.out.println(e.asXML());
 
	}
 
	/**
	 * 创建一个document对象 往document对象中添加节点元素 转存为xml文件
	 * 
	 * @throws Exception
	 */
	public void test2() throws Exception {
 
		Document document = DocumentHelper.createDocument();// 创建根节点
		Element root = document.addElement("csdn");
		Element java = root.addElement("java");
		java.setText("java班");
		Element ios = root.addElement("ios");
		ios.setText("ios班");
 
		writer(document);
	}
 
	/**
	 * 把一个文本字符串转换Document对象
	 * 
	 * @throws Exception
	 */
	public void test1() throws Exception {
		String text = "<csdn><java>Java班</java><net>Net班</net></csdn>";
		Document document = DocumentHelper.parseText(text);
		Element e = document.getRootElement();
		System.out.println(e.getName());
		writer(document);
	}
 
	/**
	 * 把document对象写入新的文件
	 * 
	 * @param document
	 * @throws Exception
	 */
	public void writer(Document document) throws Exception {
		// 紧凑的格式
		// OutputFormat format = OutputFormat.createCompactFormat();
		// 排版缩进的格式
		OutputFormat format = OutputFormat.createPrettyPrint();
		// 设置编码
		format.setEncoding("UTF-8");
		// 创建XMLWriter对象,指定了写出文件及编码格式
		// XMLWriter writer = new XMLWriter(new FileWriter(new
		// File("src//a.xml")),format);
		XMLWriter writer = new XMLWriter(new OutputStreamWriter(
				new FileOutputStream(new File("src//c.xml")), "UTF-8"), format);
		// 写入
		writer.write(document);
		// 立即写入
		writer.flush();
		// 关闭操作
		writer.close();
	}
}

JDOM方式

  • jdom:是一个第三方类库,我们使用的使用引入jdom.jar就可以使用了

引入依赖:

<!--jdom -->
<dependency>
    <groupId>org.jdom</groupId>
    <artifactId>jdom</artifactId>
    <version>1.1.3</version>
</dependency>

JDom解析xml

解析步骤

1. 创建一个SAXBuilder对象;

SAXBuilder saxBuilder = new SAXBuilder();

2. 创建一个输入流,将XML文件加载到输入流;

InputStream is = new FileInputStream(new File(“src//demo.xml”));

3. 通过SAXBuilder的build(InputStream in)方法将输入流加载到SAXBuilder中。

Document document = saxBuilder.build(is);

4.获取根节点

Element rootElement = document.getRootElement();

5.获取子节点,进行相应操作

List children = rootElement.getChildren();
for (Element child : children) {
}

案例:

在这里插入图片描述

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;

public class DomDemo {
    public static void main(String[] args) throws Exception {
        //1.创建SAXBuilder对象
        SAXBuilder saxBuilder = new SAXBuilder();
        //2.创建输入流
        InputStream is = new FileInputStream(new File("src\\\sida.xml"));
        //3.将输入流加载到build中
        Document document = saxBuilder.build(is);
        //4.获取根节点
        Element rootElement = document.getRootElement();
        //5.获取子节点
        List<Element> children = rootElement.getChildren();
        for (Element child : children) {
            System.out.println("通过rollno获取属性值:"+child.getAttribute("rollno"));
            List<Attribute> attributes = child.getAttributes();
            //打印属性
            for (Attribute attr : attributes) {
                System.out.println(attr.getName()+":"+attr.getValue());
            }
            List<Element> childrenList = child.getChildren();
            System.out.println("======获取子节点-start======");
            for (Element o : childrenList) {
                System.out.println("节点名:"+o.getName()+"---"+"节点值:"+o.getValue());
            }
            System.out.println("======获取子节点-end======");
        }
    }

}

在这里插入图片描述

使用jdom生成xml

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class XmlWrite3 {
    public static void main(String[] args) throws IOException {
        //创建元素
        Element list=new Element("list");
        Element option=new Element("option");
        Element name=new Element("name");
        Element email=new Element("email");

        //设置内容
        name.setText("abc");
        name.setAttribute("effect","false");
        email.setText("123@163.com");
        //设置关系
        option.addContent(name);
        option.addContent(email);
        list.addContent(option);
        //新建document
        Document document=new Document(list);
        XMLOutputter xmlOutputter=new XMLOutputter();
        //方法一:创建Format对象(自动缩进、换行)
        Format format = Format.getPrettyFormat();
        //并设置其编码
        format.setEncoding("GBK");
        
        xmlOutputter.setFormat(format);

        xmlOutputter.output(document, new FileOutputStream(new File("src\\main\\resources\\mapper")+
                File.separator+"writenByJdom.xml"));

    }

}

在这里插入图片描述

总结:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值