java解析XML方式

package com;
/*
 * XML:指可扩展标记语言,是独立于软件和硬件的信息工具
 * XML应用于web开发的许多方面,常用于简化数据的存储和共享。
 * XML简化数据共享。
 * XML简化数据传输。
 * XML简化平台的变更。 
 */

import java.io.FileInputStream;
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;

/*
 * XML解析方式:
 * 1:SAX解析方式:它是一行一行的读的
 * 优点:解析可以立即开始,速度快,占有内存资源少
 * 缺点:不能对节点做修改
 * 
 * 
 * 2:DOM解析方式:是W3C组织推荐的处理xml的一种方式。
 *    它是一上来就把XML整个结构都读完了,然后把读到的东西放到内存中去,如果xml的东西多,那么存内存的东西就多
 *    占用内存。
 * 优点:把xml文件在内存中构造树形结构,可以遍历和修改节点
 * 缺点:如果文件比较大,内存有压力,解析的时间会比较长。(耗时,耗资源)
 */



/*
 * 使用DOM解析xml文档,使用的是SAXReader对象
 */
public class ParseXmlDemo {
    public static void main(String[] args) {
		/*
		 * 解析empList.xml文档,将所有的员工信息读取出来并转换为若干Emp实例,存入一个List集合中。
		 * 
		 * 解析XML的流程:
		 * 1:创建SAXReader。
		 * 2:使用SAXReader读取XML文档并返回Document对象,这一步就是DOM解析耗时耗资源的体现,
		 *    因为DOM会将XML文档全部读取并以一个Document对象用于描述解析的XML文档内容。
		 * 3:根据Document对象获取根元素。
		 * 4:按照xml的结构从根元素中开始逐级获取子元素以达到遍历xml的目的。 
		 */
    	try {
    		//1
    		SAXReader reader=new SAXReader();
    		//2    empList.xml在项目的根目录下,所以这里可以直接写,不用写路径
    		Document doc=reader.read(new FileInputStream("empList.xml"));
    		/*
    		 * 3获取根元素
    		 * Element的每一个实例用于表示xml文档中的一个元素(一对标签),
    		 * 这里获取的相当于是empList.xml文档中的<empList>标签。
    		 */
    		Element root=doc.getRootElement(); 
    		/*
    		 * Element提供了获取元素的相关方法:
    		 * 
    		 * List   elements():获取当前标签下的所有子标签
    		 * List   elements(String name):获取当前标签下所有同名子标签(如果子标签有多种,想获取指定的子标签就用这种)
    		 * Element   element(String name):获取指定名字的子标签
    		 * Attribute   attribute(String name):获取指定名字的属性
    		 * String  getTest():获取当前标签中的文本(前标签和后标签中间的文本信息,前提是确实为文本而不是子标签)
    		 */
    		
    		List<Emp> empList=new ArrayList<Emp>();
    		//获取根标签<empList>下面的所有子标签<dept>,这里elements实例实际上就是每一个<dept>标签。
    		List<Element> deptElement=root.elements(); //root.elements("dept")  意思是获取所有子标签是dept的的子标签。
    		/*
    		 * 遍历所有<dept>标签并解析出该员工相关信息并以一个Emp实例保存,然后将其存入empList集合中
    		 */
    		for(Element depEle:deptElement) {
    			//获取标签<dept>下面的所有子标签<emp>,这里elements实例实际上就是每一个<emp>标签。
        		List<Element> empElement=depEle.elements(); //root.elements("emp")  意思是获取所有子标签是emp的的子标签。
        		for(Element empEle:empElement) {
        			//获取到<name>这个标签
        			Element nameEle=empEle.element("name");
        			String name=nameEle.getText();//nameEle.getTextTrim()   这样是去除内容前后的空格
        			//获取年龄
        			int age=Integer.parseInt(empEle.elementTextTrim("age"));
        			//获取性别
        			String gender=empEle.elementTextTrim("gender");
        			//获取工资
        			Double salary=Double.parseDouble(empEle.elementTextTrim("salary"));
        			System.out.println("name:"+name+" | age:"+age+" | gender:"+gender+" | salary:"+salary);
        			/*
        			 * 获取属性,属性是写在标签里面的,如<emp id="1" nn="nn" xx="xx">
        			 * 这里也可以attribute(0)意思是取<emp id="1" nn="nn" xx="xx">里第1个,也就是id="1" 
        			 * Attribute实例就是表示标签的属性。
        			 */
        			Attribute attr=empEle.attribute("id");
        			String attrName=attr.getName();
        			int idValue=Integer.parseInt(attr.getValue());
        			System.out.println("属性名:"+attrName+" | 属性值:"+idValue);
        			Emp emp=new Emp(idValue,name,age,gender,salary);
        			empList.add(emp);
        		}
    		}
    		System.out.println("============解析完毕!!!!============");
    		System.out.println("============共"+empList.size()+"个员工信息============");
    		for(Emp emp:empList) {
    			System.out.println(emp);
    		}
    	}catch(Exception e) {
    		e.printStackTrace();
    	}
    	
    	
	}
}

empList.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<empList>
    <dept name="IT">
    	<emp id="1" nn="nn" xx="xx">
			<name>张三</name>	
			<age>34</age>
			<gender>男</gender>
			<salary>3000</salary>
		</emp>
		
		<emp id="2">
			<name>李四</name>	
			<age>30</age>
			<gender>女</gender>
			<salary>4000</salary>
		</emp>
		
		<emp id="3">
			<name>王五</name>	
			<age>24</age>
			<gender>男</gender>
			<salary>7000</salary>
		</emp>
		
    </dept>
    
    <dept name="XIAOSHOU">
    	<emp id="1">
			<name>张三10</name>	
			<age>70</age>
			<gender>男</gender>
			<salary>30000</salary>
		</emp>
    </dept>
	
</empList>

控制台输出结果:


需要的jar包:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值