天天看點

Android使用Dom4j解析xml,并存入自定義實體

說到解析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 plain copy

  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 plain copy

  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 plain copy

  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 plain copy

  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 plain copy

  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());

           

輸出結果:

Android使用Dom4j解析xml,并存入自定義實體

至此解析完成。

當然解析xml檔案也可以用這種方法。省略了我們一個個讀節點并放入實體中的部分,隻需要定義自己的實體類調用即可。