XML相关操作

有一个Emp类,用于描述员工

代码如下:

/**
 * 该类用于描述emp.xml文件中的员工
 */
public class Emp {
	private int id;
	private String name;
	private int age;
	private String gender;
	private int salary;
	public Emp(){}
	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 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;
	}
}
代码一:
/**
 * 使用DOM解析XML文件
 */
public class XMLDemo1 {
	public static void main(String[] args) {
		/**
		 * 解析XML文件的基本流程
		 * 1.创建SAXReader用来读取XML文件
		 * 2.指定xml文件使得SAXReader读取,并解析成文档对象Document
		 * 3.获取更元素
		 * 4.获取每一个元素,从而达到解析的目的
		 */
		/**
		 * 常用的读取方法
		 * Docment read(InputStream in)  字节流
		 * Docment read(Reader read)     字符流
		 * Docment read(File file)       文件对象
		 */
		SAXReader reader = new SAXReader();
		File fileXml = new File("emp.xml"); 
		try {
			Document doc = reader.read(fileXml);
			Element root = doc.getRootElement();
			/**
			 * Element element(String name)
			 * 获取当前标签下第一个名为给定名字的标签
			 * 
			 * List elements(String name)
			 * 获取当前标签下所有给定名字的标签
			 * 
			 * List eleemnts()
			 * 获取当前标签下所有的子标签
			 * 
			 * String elementText(Stirng name)
			 * 获取当前标签中名为给定名字的子标签中间的文本
			 * 
			 * Attribute attribute(String name)
			 * 获取当前标签中指定名字的属性
			 * 
			 * String getName()
			 * 获取属性的名字
			 * 
			 * String getValue
			 * 获取属性的值 
			 * 
			 */
			List<Emp> list = new ArrayList<Emp>();
			List<Element> listXml = root.elements("emp");
			for(Element emp : listXml){
				Attribute att = emp.attribute("id");
				int id = Integer.parseInt(att.getValue());
				String name = emp.elementText("name");
				int age = Integer.parseInt(emp.elementText("age"));
				String gender = emp.elementText("gender");
				
				int salary = Integer.parseInt(emp.elementText("salary"));
				
				list.add(new Emp(id,name,age,gender,salary));
			}
			System.out.println("解析了"+list.size()+"个员工信息");
			//输出每个员工的信息
			for(Emp e : list){
				System.out.println(e);
			}
			
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
}
测试结果如下:

解析了5个员工信息
1,张三,34,男,3000
2,李四,21,女,4000
3,王五,46,女,6500
4,赵六,28,男,4400
5,钱七,53,男,12000
*************************************************************************************************************************************
代码二:

/**
 * 使用DOM写出一个XML
 */
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,"男",5500));
		list.add(new Emp(3,"marry",22,"女",3500));
		list.add(new Emp(4,"kate",25,"女",6000));
		list.add(new Emp(5,"tom",31,"男",8500));
		/**
		 * 生成一个XML文件的基本步骤
		 * 1.创建文档对象Document
		 * 2.为Document添加根节点
		 * 3.为根节点组建树状结构
		 * 4.创建XMLWriter
		 * 5.为XMLWriter指定写出目标
		 * 6.写出xml
		 */
		Document doc = DocumentHelper.createDocument();
		/**
		 * Document的方法
		 * Element addElement(String name)
		 * 该方法用于向文档中添加给定名字的根元素,返回的Element实例就表示该根元素
		 * 需要注意的是,该方法只能调用一次,调用第二次会抛出异常
		 * 
		 * Element addElement(String name)
		 * 向当前标签中添加给定名字的子标签
		 */
		Element root = doc.addElement("list");
		//循环添加每一个员工信息
		for(Emp e : list){
			Element emp = root.addElement("emp");
			/**
			 * Element addAttribute(String name,String value)
			 * 为当前标签添加给定名字以及对应值的属性,返回值任然为当前标签
			 * 这样做的目的是可以连续添加若干属性
			 */
			emp.addAttribute("id", String.valueOf(e.getId()));
			Element name = emp.addElement("name");
			name.setText(e.getName());//addText()方法是在原有字符串后追加
			emp.addElement("age").setText(String.valueOf(e.getAge()));
			emp.addElement("gender").addText(e.getGender());
			emp.addElement("salary").addText(String.valueOf(e.getSalary()));
		}
		/**
		 * 当退出循环后,那么Document中的结构就已经建完了,需要将其写出为xml
		 */
		XMLWriter writer = null;
		FileOutputStream out = null;
		try {
			writer = new XMLWriter(
					new FileOutputStream("myemp.xml"),
					OutputFormat.createPrettyPrint()
					);
			/**
			 * 将Document对象写出到文件中、这时会将Document转换为xml格式写入文件
			 */
			writer.write(doc);
		} catch (Exception e1) {
			e1.printStackTrace();
		} finally {
			if(writer != null){
				try {
					writer.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		}
	}
}
测试结果如下:

<?xml version="1.0" encoding="UTF-8"?>
<list>
  <emp id="1">
    <name>jack</name>
    <age>33</age>
    <gender>男</gender>
    <salary>5000</salary>
  </emp>
  <emp id="2">
    <name>boss</name>
    <age>55</age>
    <gender>男</gender>
    <salary>5500</salary>
  </emp>
  <emp id="3">
    <name>marry</name>
    <age>22</age>
    <gender>女</gender>
    <salary>3500</salary>
  </emp>
  <emp id="4">
    <name>kate</name>
    <age>25</age>
    <gender>女</gender>
    <salary>6000</salary>
  </emp>
  <emp id="5">
    <name>tom</name>
    <age>31</age>
    <gender>男</gender>
    <salary>8500</salary>
  </emp>
</list>

**************************************************************************************************************

代码三:

/**
 * DOM4J对XPatch的支持
 */
public class XMLDemo3 {
	public static void main(String[] args) {
		SAXReader reader = new SAXReader();
		try {
			Document doc = reader.read(new File("myemp.xml")) ;
			/**
			 * List selectNodes(String xpath)
			 * 根据给定的xpath查询对应的节点
			 */
//			String path = "/list/emp[salary>5000]";//工资大于5000的人
//			String path = "/list/emp[gender='女']/salary[.>4000]";//工资大于4000的女同志的工资
			String path = "/list/emp[gender='女' and age>20]/salary";//女同志中年龄大于24岁的工资
			List list = doc.selectNodes(path);//List不用添加泛型,因为xpath除了获取标签之外还有属性,根据获取的内容强转即可
			for(Object o : list){
				Element e = (Element) o;
				System.out.println(e.getText());
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荒--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值