java基础-使用dom4j解析XML文件

解析XML

解析过程

      /*

* 解析XML文件的基本流程
* 1:创建SAXReader,用来读取XML
*   文件
* 2:指定xml文件使得SAXReader读取,
*   并解析问文档对象Document
* 3:获取根元素
* 4:获取每一个元素,从而达到解析的
*   目的。    

*/

代码

1.1

用到的辅助类

package demoXml;
/**
 * 该类用于描述emp.xml文件中表示的员工
 * @author Administrator
 *
 */
public class Emp {
	private int id;
	private String name;
	private int age;
	private String gender;
	private int salary;
	
	public Emp(int id, String name, int age, String gender, int salary) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.gender = gender;
		this.salary = salary;
	}
	/**
	 * 无参的构造方法:
	 * 当我们没有定义构造方法时,编译器会自动
	 * 帮我们添加一个默认的构造方法。
	 * 默认构造方法:
	 * 无参数,且没有任何实现代码。如下。
	 * 若我们定义过任何构造方法,编译器不会为
	 * 我们添加该默认构造方法,若需要,则手动
	 * 书写
	 */
	public Emp(){
		
	}
	
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}
	
	public String toString(){
		return id+","+name+","+age+","+gender+","+salary;
	}
	
}



1.2

解析代码

package demoXml;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * 使用DOM解析XML文件
 * @author Administrator
 *
 */
public class XMLDemo1 {
	public static void main(String []args){
			try{
				/*
				 * 解析XML文件的基本流程
				 * 1:创建SAXReader,用来读取XML
				 *   文件
				 * 2:指定xml文件使得SAXReader读取,
				 *   并解析问文档对象Document
				 * 3:获取根元素
				 * 4:获取每一个元素,从而达到解析的
				 *   目的。    
				 */
				//1
				//org.dom4j.xxxx
				SAXReader reader
								= new SAXReader();
				
				//2
				/*
				 * 常用的读取方法
				 * Document read(InputStream in)
				 * Document read(Reader read)
				 * Document read(File file)
				 */
				File xmlFile 
							= new File("emp.xml");
				//2
				/*
				 * read方法的作用:
				 * 读取给定的xml,并将其解析转换为
				 * 一个Document对象。
				 * 实际上这里已经完成了对整个xml
				 * 解析的工作。并将所有内容封装到了
				 * Document对象中。
				 * Document对象可以描述当前xml文档
				 */
				Document doc 
							= reader.read(xmlFile);
				
				//3
				Element root
							= doc.getRootElement();
				
				//4
				/*
				 * Element element(String name)
				 * 获取当前标签下第一个名为给定
				 * 名字的标签
				 * 
				 * List elements(String name)
				 * 获取当前标签下所有给定名字的
				 * 标签
				 * 
				 * List elements()
				 * 获取当前标签下的所有子标签。
				 */
				List<Element> elements 
								= root.elements();
				/*
				 * 创建一个集合,用于保存xml中
				 * 的每一个用户信息。我们先将
				 * 用户信息取出,然后创建一个Emp
				 * 实例,将信息设置到该实例的相应
				 * 属性上。最终将所有emp对象存入
				 * 该集合。
				 */
				List<Emp> list
					= new ArrayList<Emp>();
				/*
				 *	遍历每一个emp标签 
				 */
				for(Element emp : elements){
					//创建一个Emp对象,用于保存信息
					Emp e = new Emp();
					
					//解析emp标签
					//获取name的值
					/*
					 * 首先,获取名为"name"的子标签
					 * 其次,获取前后标签中间的文本
					 */
					Element ename
						=	emp.element("name");
					String name
						=	ename.getText();
					
					//获取年龄
					/*
					 * String elementText(String name)
					 * 获取当前标签中名为给定名字的子标签
					 * 中间的文本
					 * 该方法与上面获取“name”的两句话等效
					 */
					String ageStr
						= emp.elementText("age");
					int age 
						= Integer.parseInt(ageStr);
					
					//解析性别
					String gender
						= emp.elementText("gender");
					
					//解析工资
					int salary
						= Integer.parseInt(
							 emp.elementText("salary")	
						  );
					
					e.setAge(age);
					e.setName(name);
					e.setGender(gender);
					e.setSalary(salary);
					
					/*
					 * 通过Element获取元素属性
					 * 
					 * Attribute attribute(String name)
					 * 获取当前标签中指定名字的属性
					 */
					//获取id属性
					Attribute attr
						=	emp.attribute("id");
					//获取该属性的值
					/*
					 * Attribute表示一个属性,常用方法:
					 * 
					 * String getValue()
					 * 获取该属性的值
					 * 
					 * String getName()
					 * 获取该属性的名字
					 */
					int id =Integer.parseInt(
										attr.getValue()
									);
					
					e.setId(id);
					//将Emp对象存入集合
					list.add(e);
				}
				
				System.out.println(
						"解析了"+list.size()+
						"个员工信息");
				
				//输出每一个员工信息
				for(Emp e : list){
					System.out.println(e);
				}
				
				
			}catch(Exception e){
				
			}
	}
}



写入XML

package demoXml;

import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

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

/**
 * 使用DOM写出一个XML
 * @author Administrator
 *
 */
public class XMLDemo2 {
	public static void main(String[] args){		
		List<Emp> list
			= new ArrayList<Emp>();
		list.add(
			new Emp(1,"jack",33,"男",5000)
		);
		list.add(
				new Emp(2,"boss",55,"男",55000)
			);
		list.add(
				new Emp(3,"marry",22,"女",3500)
			);
		list.add(
				new Emp(4,"kate",25,"女",6000)
			);
		list.add(
				new Emp(5,"tom",32,"男",8500)
			);
		
		/*
		 * 生成一个xml的基本步骤
		 * 1:创建文档对象Document
		 * 2:为Document添加根节点
		 * 3:为根节点组建树状结构
		 * 4:创建XMLWriter
		 * 5:为XMLWriter指定写出目标
		 * 6:写出xml
		 */
		//1
		//通过DocumentHelper创建Document对象
		Document doc 
			= DocumentHelper.createDocument();
		
		//2
		/*
		 * Document的方法
		 * Element addElement(String name)
		 * 该方法用于向文档中添加给定名字的
		 * 根元素,返回的Element实例就表示该
		 * 根元素
		 * 需要注意的是,该方法只能调用一次。
		 * 调用第二次会抛出异常。 
		 */
		Element root 
				= doc.addElement("list");
		/*
		 * 循环添加每一个员工信息
		 */
		for(Emp e : list){
			/*
			 * Element同样支持方法:
			 * Element addElement(String name)
			 * 向当前标签中添加给定名字的子标签
			 */
			//向根标签中添加emp标签
			Element emp 
				=	root.addElement("emp");
			
			//向emp标签中添加子标签name
			Element name
				= emp.addElement("name");
			name.addText(e.getName());
			//向emp标签中添加子标签age
			emp.addElement("age")
			.addText(e.getAge()+"");
			emp.addElement("gender")
			.addText(e.getGender());
			emp.addElement("salary")
			.addText(e.getSalary()+"");

			/*
			 * 为标签添加属性
			 * Element addAttribute(
			 * 		String name,String value
			 * )
			 * 为当前标签添加给定名字以及对应值的
			 * 属性
			 * 返回值仍然为当前标签。
			 * 这样做的目的是可以连续添加若干属性
			 * 就好像StringBuilder的append的
			 * 返回值效果和作用。
			 */
			emp.addAttribute("id",e.getId()+"");
			
		}
		
		/*
		 * 当退出循环后,那么Document中的
		 * 结构就已经构建完了
		 * 需要将其写出为xml
		 */
		try{
			XMLWriter writer
					= new XMLWriter();
			
			FileOutputStream out
				= new FileOutputStream(
											"myemp.xml");
			
			writer.setOutputStream(out);
			/*
			 * 将Document对象写出到文件中
			 * 这时会将Document转换为xml格式
			 * 写入文件。
			 */
			writer.write(doc);
			
			writer.close();
		}catch(Exception e){
			
		}
	}
}


DOM4J对XPATH的支持

package demoXml;

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

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * DOM4J对XPATH的支持
 * @author Administrator
 *
 */
public class XMLDemo3 {
	public static void main(String[] args){
		try{
			//读取xml文件转换为Document
			SAXReader reader
				= new SAXReader();
			
			Document doc 
					= reader.read(
							new File("myemp.xml")
						);
			String path 
				= "/list/emp[gender='女']" +
					"/salary[.>4000]";
			/*
			 * List selectNodes(String xpath)
			 * 根据给定的XPATH查询对应的节点
			 */
			List list 
				= doc.selectNodes(path);
			for(Object o : list){
				Element e = (Element)o;
				System.out.println(e.getText());
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}





猜你喜欢

转载自blog.csdn.net/jk823394954/article/details/78965202