XML文件的写入和读取(解析)基于DOM4J工具

前端之家收集整理的这篇文章主要介绍了XML文件的写入和读取(解析)基于DOM4J工具前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

这两天做了个天气的小应用,需要用到百度的天气api,获取到的信息是一个xml文档。

所以就从网上查了一下相关的知识,就是关于怎么去解析出来xml文件的信息。

先放一个我自己写的例子,加了点注释,贴这里吧。

package cn.yzy.test;

import java.util.List;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.Iterator;

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

public class MyTest {

	/**
	 * DOM4J读写XML示例
	 */
	public static void main(String[] args) {
		// 用变量保存一下xml文件的路径
		String path = "d:\\temp\\student.xml";
		// 创建xml的方法
		createXML(path);
		// 读取xml文件方法
		readXML(path);

		// 把xml文件读取成String
		String xml = readFile(path);
		// 输出一下xml
		System.out.println(xml);
		// 把String的xml解析出来
		readXMLStr(xml);
	}

	/**
	 * readFile 读取文件到String
	 * 
	 * @param path
	 * @return
	 */
	public static String readFile(String path) {
		String txt = "";
		try {
			// 读取文件
			File file = new File(path);
			// 创建输入流
			InputStreamReader isReader = new InputStreamReader(
					new FileInputStream(file),"utf-8");
			// 缓冲区
			BufferedReader bf = new BufferedReader(isReader);
			// 循环把文本读取出来
			String lineTxt = null;
			while ((lineTxt = bf.readLine()) != null) {
				txt += lineTxt;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		// 最后把文本字符串返回
		return txt;
	}

	/**
	 * createXML 创建XML到指定目录
	 * 
	 * @param path
	 */
	public static void createXML(String path) {
		// 读取文件,检查文件是否存在,存在就不创建文件了。
		File file = new File(path);

		if (!file.exists()) {
			try {
				// 创建xml文档,用DocumentHelper
				Document dc = DocumentHelper.createDocument();
				// 在文档里要加入元素节点
				// 添加 根节点 -> 学生信息
				Element root = dc.addElement("学生信息");
				// 在 学生信息节点 中 加入 学生
				Element stu1 = root.addElement("学生");
				// 可以设置属性,设置学生 sid 属性为 001
				stu1.addAttribute("sid","001");
				// 在学生里面加入子元素,键值对应
				Element name1 = stu1.addElement("姓名");
				name1.setText("张三");
				Element sex1 = stu1.addElement("性别");
				sex1.setText("男");
				Element stu2 = root.addElement("学生");
				stu2.addAttribute("sid","002");
				Element name2 = stu2.addElement("姓名");
				name2.setText("小红");
				Element sex2 = stu2.addElement("性别");
				sex2.setText("女");

				// xml文档生成,准备写入文件文件路径和格式设置好。
				// 输出格式以及编码设置
				OutputFormat format = new OutputFormat("\n",true);
				format.setEncoding("utf-8");
				// 声明一个写文件的类
				XMLWriter writer = new XMLWriter(new FileOutputStream(path),format);
				// 写文件,完成后关闭
				writer.write(dc);
				writer.close();
				System.out.println("操作成功");
			} catch (IOException e) {
				e.printStackTrace();
			}
		} else {
			System.out.println("文件已存在");
		}
	}

	/**
	 * readXML 读取XML,从指定文件路径
	 * 
	 * @param path
	 */
	public static void readXML(String path) {
		try {
			// 输出文件是否存在
			System.out.println(new File(path).exists());
			// 新建一个读取xml文档的对象
			SAXReader reader = new SAXReader();
			// 将文件读入Document
			Document dc = reader.read(path);

			System.out.println(dc.toString());
			// 读取根节点
			Element root = dc.getRootElement();
			// 遍历根节点下,所有子节点(仅能访问到一层)
			List nodes = root.elements();
			for (Iterator it = nodes.iterator(); it.hasNext();) {
				Element ele = (Element) it.next();
				System.out.println(ele.getName() + ele.attributeValue("sid"));
				System.out.println(ele.elementText("姓名"));
				System.out.println(ele.elementText("性别"));
			}

		} catch (DocumentException e) {
			e.printStackTrace();
		}
		System.out.println("--- --- End --- ---");
	}

	/**
	 * readXMLStr 从String中读取XML信息
	 * 
	 * @param xml
	 */
	public static void readXMLStr(String xml) {
		try {
			System.out.println("--- --- readXMLStr --- ---");

			// 同样是创建读取xml的类,但是读取方法参数改为:new StringReader(xml) 从字符串读取
			SAXReader reader = new SAXReader();
			Document dc = reader.read(new StringReader(xml));

			System.out.println(dc.toString());

			Element root = dc.getRootElement();

			List nodes = root.elements();
			for (Iterator it = nodes.iterator(); it.hasNext();) {
				Element ele = (Element) it.next();
				System.out.println(ele.getName() + ele.attributeValue("sid"));
				System.out.println(ele.elementText("姓名"));
				System.out.println(ele.elementText("性别"));
			}

		} catch (DocumentException e) {
			e.printStackTrace();
		}
		System.out.println("--- --- End --- ---");
	}
}


以下是我从其他一个博客里参考的一些资料,深受启发:


网址:

http://www.blogjava.net/biiau/archive/2008/09/24/231005.html


部分DOM4J的解释 一.Document对象相关 1.读取XML文件,获得document对象. SAXReader reader = new SAXReader(); Document document = reader.read(new File("input.xml")); 2.解析XML形式的文本,得到document对象. String text = "<members></members>"; Document document = DocumentHelper.parseText(text); 3.主动创建document对象. Document document = DocumentHelper.createDocument(); Element root = document.addElement("members");// 创建根节点 二.节点相关 1.获取文档的根节点. Element rootElm = document.getRootElement(); 2.取得某节点的单个子节点. Element memberElm=root.element("member");// "member"是节点名 3.取得节点的文字 String text=memberElm.getText(); 也可以用: String text=root.elementText("name"); 这个是取得根节点下的name字节点的文字. 4.取得某节点下名为"member"的所有字节点并进行遍历. List nodes = rootElm.elements("member"); 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 ageElm = newMemberElm.addElement("age"); 7.设置节点文字. ageElm.setText("29"); 8.删除某节点. parentElm.remove(childElm);// childElm是待删除的节点,parentElm是其父节点 9.添加一个CDATA节点. Element contentElm = infoElm.addElement("content"); contentElm.addCDATA(diary.getContent()); contentElm.getText(); // 特别说明:获取节点的CDATA值与获取节点的值是一个方法 contentElm.clearContent(); //清除节点中的内容,CDATA亦可 三.属性相关. 1.取得某节点下的某属性 Element root=document.getRootElement(); Attribute attribute=root.attribute("size");// 属性名name 2.取得属性文字 String text=attribute.getText(); 也可以用: String text2=root.element("name").attributeValue("firstname"); 这个是取得根节点下name字节点的属性firstname的值. 3.遍历某节点的所有属性 Element root=document.getRootElement(); for(Iterator it=root.attributeIterator();it.hasNext();){ Attribute attribute = (Attribute) it.next(); String text=attribute.getText(); System.out.println(text); } 4.设置某节点的属性文字. newMemberElm.addAttribute("name","sitinspring"); 5.设置属性文字 Attribute attribute=root.attribute("name"); attribute.setText("sitinspring"); 6.删除属性 Attribute attribute=root.attribute("size");// 属性名name root.remove(attribute); 四.将文档写入XML文件. 1.文档中全为英文,不设置编码,直接写入的形式. XMLWriter writer = new XMLWriter(new FileWriter("output.xml")); writer.write(document); writer.close(); 2.文档中含有中文,设置编码格式写入的形式. OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("GBK"); // 指定XML编码 XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format); writer.write(document); writer.close(); 五.字符串与XML的转换 1.将字符串转化为XML String text = "<members> <member>sitinspring</member> </members>"; Document document = DocumentHelper.parseText(text); 2.将文档或节点的XML转化为字符串. SAXReader reader = new SAXReader(); Document document = reader.read(new File("input.xml")); Element root=document.getRootElement(); String docXmlText=document.asXML(); String rootXmlText=root.asXML(); Element memberElm=root.element("member"); String memberXmlText=memberElm.asXML();

原文链接:https://www.f2er.com/xml/297677.html

猜你在找的XML相关文章