深入理解XML文件的解析、编辑等操作

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 huawangxin
 *
 */
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");
			/*
			 * read方法的作用:
			 * 读取给定的xml,并将其解析转换为一个Document对象。
			 * 实际上这里已经完成了对整个xml解析的工作。并将所有内容封装到了Document对象中
			 * Document对象可以描述当前xml文档。
			 */
			Document doc=reader.read(xmlFile);
			//3
			Element root=doc.getRootElement();
			
			/*
			 * Element element(String name)
			 * 获取单签变迁第一个名为给定名字的标签
			 * List element(String name)
			 * 获取当前标签下所有给定名字的标签
			 * List elements()
			 * 获取当前标签下的所有子标签
			 */
			List<Element> elements=root.elements("emp");
			
			/*
			 * 创建一个集合,用于保存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();
				
				//获取年龄
//				Element eage=emp.element("age");
//				String age=eage.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){
			
		}
	}
}


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 huawangxin
 */
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, "男", 8000));
		list.add(new Emp(3, "marry", 22, "女", 7000));
		list.add(new Emp(4, "kate", 30, "女", 10000));
		list.add(new Emp(5, "tom", 23, "男", 12000));
		/*
		 * 生成一个xml的基本步骤
		 * 1:创建文档对象Document
		 * 2:为Document添加根节点
		 * 3:为根节点组件树状结构
		 * 4:创建xmlWiter
		 * 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 addElemnet(String name)
			 * 向前标签中添加给定名字的子标签
			 */
			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()+"");
			
			
		}
		/*
		 * 当退出循环后,n那么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) {
			// TODO: handle exception
		}
	}
}

import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/*
 * DOM4J对XPATHs的支持
 */
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(o);
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
}







上述如果有不对或者补充的地方,请大家批评和指教,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值