关闭

Android使用Dom4j解析xml,并存入自定义实体

标签: android解析xmldom4j
1919人阅读 评论(0) 收藏 举报
分类:

说到解析xml,相信大家都知道Android中的三中解析方式,这里就不在多做介绍了,说一下最近刚刚用的dom4j吧,dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。

  使用Dom4j开发,需下载dom4j相应的jar文件

 .官网下载: http://www.dom4j.org/dom4j-1.6.1/ 

得到文件解压dom4j-1.6.1.jar,将jar包放入我们的项目中,在项目开发的过程中可以参考docs文件夹的(帮助文档),找到index.html打开,点击Quick start可以通过帮助文档进行学习 dom4j进行xml的解析.

参考:http://blog.csdn.net/redarmy_chen/article/details/12969219

一、DOM4j中,获得Document对象的方式有三种:

[java] view plaincopy
  1. 1.读取XML文件,获得document对象              
  2.                   SAXReader reader = new SAXReader();                 
  3.        Document   document = reader.read(new File("csdn.xml"));  
  4. 2.解析XML形式的文本,得到document对象.  
  5.                   String text = "<csdn></csdn>";               
  6.                   Document document = DocumentHelper.parseText(text);  
  7. 3.主动创建document对象.  
  8.                  Document document = DocumentHelper.createDocument();              //创建根节点  
  9.                  Element root = document.addElement("csdn");  

二、节点对象操作的方法

[java] view plaincopy
  1. 1.获取文档的根节点.  
  2.       Element root = document.getRootElement();  
  3.     2.取得某个节点的子节点.  
  4.       Element element=node.element(“四大名著");  
  5.     3.取得节点的文字  
  6.         String text=node.getText();  
  7.     4.取得某节点下所有名为“csdn”的子节点,并进行遍历.   
  8.        List nodes = rootElm.elements("csdn");    
  9.          for (Iterator it = nodes.iterator(); it.hasNext();) {      
  10.       Element elm = (Element) it.next();     
  11.     // do something  
  12.  }  
  13.      5.对某节点下的所有子节点进行遍历.       
  14.       for(Iterator it=root.elementIterator();it.hasNext();){         
  15.         Element element = (Element) it.next();         
  16.        // do something    
  17.  }  
  18.     6.在某节点下添加子节点  
  19.        Element elm = newElm.addElement("朝代");  
  20.     7.设置节点文字.   elm.setText("明朝");  
  21.     8.删除某节点.//childElement是待删除的节点,parentElement是其父节点  parentElement.remove(childElment);  
  22.     9.添加一个CDATA节点. Element contentElm = infoElm.addElement("content"); contentElm.addCDATA(“cdata区域”);  

三、节点对象的属性方法操作

[java] view plaincopy
  1. 1.取得某节点下的某属性     Element root=document.getRootElement();         //属性名name  
  2.          Attribute attribute=root.attribute("id");  
  3.     2.取得属性的文字  
  4.     String text=attribute.getText();  
  5.     3.删除某属性  Attribute attribute=root.attribute("size");  root.remove(attribute);  
  6.     4.遍历某节点的所有属性      
  7.       Element root=document.getRootElement();         
  8.        for(Iterator it=root.attributeIterator();it.hasNext();){           
  9.            Attribute attribute = (Attribute) it.next();            
  10.            String text=attribute.getText();           
  11.            System.out.println(text);     
  12.   }  
  13.     5.设置某节点的属性和文字.    newMemberElm.addAttribute("name""sitinspring");  
  14.     6.设置属性的文字    Attribute attribute=root.attribute("name");    attribute.setText("csdn");  

四、将文档写入XML文件

[java] view plaincopy
  1. 1.文档中全为英文,不设置编码,直接写入的形式.     
  2.        XMLWriter writer = new XMLWriter(new  FileWriter("ot.xml"));    
  3.        writer.write(document);     
  4.        writer.close();  
  5.     2.文档中含有中文,设置编码格式写入的形式.   
  6.        OutputFormat format = OutputFormat.createPrettyPrint();// 创建文件输出的时候,自动缩进的格式                    
  7.        format.setEncoding("UTF-8");//设置编码  
  8.         XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);  
  9.         writer.write(document);  
  10.         writer.close();  

五、字符串与XML的转换

[java] view plaincopy
  1. 1.将字符串转化为XML  
  2.       String text = "<csdn> <java>Java班</java></csdn>";  
  3.       Document document = DocumentHelper.parseText(text);  
  4.     2.将文档或节点的XML转化为字符串.  
  5.        SAXReader reader = new SAXReader();  
  6.        Document   document = reader.read(new File("csdn.xml"));              
  7.         Element root=document.getRootElement();      
  8.         String docXmlText=document.asXML();   
  9.        String rootXmlText=root.asXML();  
  10.        Element memberElm=root.element("csdn");  
  11.         String memberXmlText=memberElm.asXML();  

以上部分我们在网上都可以找到,下面列举一个我自己写的实例吧。我写的是将字符串转化为xml在进行解析,并存入自定义实体,不需要单独获取节点存放到实体类。

先上xmlutils解析类,注释都在里面:

public class XMLUtils<T> {
	public List<T> readXML(String XMLPathAndName, T t) {   

		List<T> list = new ArrayList<T>();//创建list集合   
		try {
			// 获取实体类的所有属性,返回Field数组  
			Field[] field = t.getClass().getDeclaredFields(); 
			//将字符串转化为xml
			Document doc=DocumentHelper.parseText(XMLPathAndName);
			//获得根节点
			Element node = doc.getRootElement();
			Iterator<Element> it = node.elementIterator();  
			Element e ;
			// 遍历  
			for (Iterator i = it; i.hasNext();) { 
				// 获取某个子节点对象  
				e= it.next();  
				//获取实体类实例
				t=(T)t.getClass().newInstance();
				
				for (int j = 0; j < field.length; j++) {  
					// 获取属性的名字  
					String name = field[j].getName();  
					//将第一位转化为大写,便于获取实体类中set,get方法
					name = name.substring(0, 1).toUpperCase() + name.substring(1);  
					//获得set方法
					Method m = t.getClass().getMethod("set" + name,String.class); 
					//e.elementText元素的某个指定的子元素中的text信息
					m.invoke(t,e.elementText(field[j].getName().toUpperCase()));  
				}
				list.add(t); 
			}	
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;   
	}  
}
实体类:
public class Bean {
	private String result;
	private String guester;
	private String chinesename;
	private String birthday;
	private String idnumber;
	private String nation;
	private String address;
	private String checkin;
	private String checkout;
	public String getResult() {
		return result;
	}
	public void setResult(String result) {
		this.result = result;
	}
	public String getGuester() {
		return guester;
	}
	public void setGuester(String guester) {
		this.guester = guester;
	}
	public String getChinesename() {
		return chinesename;
	}
	public void setChinesename(String chinesename) {
		this.chinesename = chinesename;
	}
	public String getBirthday() {
		return birthday;
	}
	public void setBirthday(String birthday) {
		this.birthday = birthday;
	}
	public String getIdnumber() {
		return idnumber;
	}
	public void setIdnumber(String idnumber) {
		this.idnumber = idnumber;
	}
	public String getNation() {
		return nation;
	}
	public void setNation(String nation) {
		this.nation = nation;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getCheckin() {
		return checkin;
	}
	public void setCheckin(String checkin) {
		this.checkin = checkin;
	}
	public String getCheckout() {
		return checkout;
	}
	public void setCheckout(String checkout) {
		this.checkout = checkout;
	}
	
}
xml

	<RESULT>
	<GUESTER>
	<CHINESENAME>张三</CHINESENAME>
	<BIRTHDAY>2000-01-01</BIRTHDAY>
	<IDNUMBER>1234567890</IDNUMBER>
	<NATION>汉</NATION>
	<ADDRESS>北京</ADDRESS>
	<CHECKIN>2000-01-01</CHECKIN>
	<CHECKOUT>2000-01-01</CHECKOUT>
	</GUESTER>
	<GUESTER>
	<CHINESENAME>李四</CHINESENAME>
	<BIRTHDAY>2001-01-01</BIRTHDAY>
	<IDNUMBER>9876543210</IDNUMBER>
	<NATION>汉</NATION>
	<ADDRESS>上海</ADDRESS>
	<CHECKIN>2001-01-01</CHECKIN>
	<CHECKOUT>2001-01-01</CHECKOUT>
	</GUESTER>
	</RESULT>
调用方法解析xml:

private List<Bean> list=new ArrayList<Bean>();

XMLUtils<Bean> b=new XMLUtils<Bean>();
list=b.readXML(xml, bean);

System.out.println(list.get(0).getAddress());
System.out.println(list.get(1).getAddress());

输出结果:


至此解析完成。

当然解析xml文件也可以用这种方法。省略了我们一个个读节点并放入实体中的部分,只需要定义自己的实体类调用即可。








0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:14840次
    • 积分:285
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:5篇
    • 译文:0篇
    • 评论:10条
    文章分类
    文章存档
    最新评论