1. 程式人生 > >Android 創建與解析XML(五)—— Dom4j方式

Android 創建與解析XML(五)—— Dom4j方式

check img size tree clas pri UNC content including

分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net

1、Dom4j概述

dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java Collections Framework and with full support for DOM, SAX and JAXP.

dom4j官方網址:dom4j

dom4j源碼下載:dom4j download

本示例中,需要導入dom4j.jar包,才能引用dom4j相關類,dom4j源碼和jar包,請見本示例【源碼下載】或訪問 dom4j

org.dom4j包,不僅包含創建xml的構建器類DocumentHelper、Element,而且還包含解析xml的解析器SAXReader、Element,包含類如下:

org.dom4j

org.dom4j.DocumentHelper;

org.dom4j.Element;

org.dom4j.io.SAXReader;

org.dom4j.io.XMLWriter;

org.dom4j.DocumentException;

sdk源碼查看路徑(google code)

創建和解析xml的效果圖:

技術分享圖片

2、Dom4j 創建 XML

Dom4j,創建xml主要用到了org.dom4j.DocumentHelper、org.dom4j.Document、org.dom4j.io.OutputFormat、org.dom4j.io.XMLWriter

首先,DocumentHelper.createDocument(),創建 org.dom4j.Document 的實例 doc

接著,通過doc,設置xml屬性doc.setXMLEncoding("utf-8")、doc.addElement("root")根節點,以及子節點等

然後,定義xml格式並輸出,new XMLWriter(xmlWriter, outputFormat)

Code

	/** Dom4j方式,創建 XML  */
	public String dom4jXMLCreate(){
		StringWriter xmlWriter = new StringWriter();

		Person []persons = new Person[3];		// 創建節點Person對象
		persons[0] = new Person(1, "sunboy_2050", "http://blog.csdn.net/sunboy_2050");
		persons[1] = new Person(2, "baidu", "http://www.baidu.com");
		persons[2] = new Person(3, "google", "http://www.google.com");
		
		try {
			org.dom4j.Document doc = DocumentHelper.createDocument();
			
			doc.setXMLEncoding("utf-8");
			
			org.dom4j.Element eleRoot = doc.addElement("root");
			eleRoot.addAttribute("author", "homer");
			eleRoot.addAttribute("date", "2012-04-25");
			eleRoot.addComment("dom4j test");
			
			int personsLen = persons.length;
			for(int i=0; i<personsLen; i++){
				
				Element elePerson = eleRoot.addElement("person");	// 創建person節點,引用類為 org.dom4j.Element
				
				Element eleId = elePerson.addElement("id");
				eleId.addText(persons[i].getId()+"");
				
				Element eleName = elePerson.addElement("name");
				eleName.addText(persons[i].getName());
				
				Element eleBlog = elePerson.addElement("blog");
				eleBlog.addText(persons[i].getBlog());
			}

			org.dom4j.io.OutputFormat outputFormat = new org.dom4j.io.OutputFormat();	// 設置xml輸出格式
			outputFormat.setEncoding("utf-8");
			outputFormat.setIndent(false);
			outputFormat.setNewlines(true);
			outputFormat.setTrimText(true);
			
			org.dom4j.io.XMLWriter output = new XMLWriter(xmlWriter, outputFormat);		// 保存xml
			output.write(doc);
			output.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		savedXML(fileName, xmlWriter.toString());
		return xmlWriter.toString();
	}

運行結果:

技術分享圖片

3、Dom4j 解析 XML

Dom4j,解析xml主要用到了org.dom4j.io.SAXReader、org.dom4j.Document、doc.getRootElement(),以及ele.getName()、ele.getText()等

首先,創建SAXReader的實例reader,讀入xml字節流 reader.read(is)

接著,通過doc.getRootElement()得到root根節點,利用叠代器取得root下一級的子節點eleRoot.elementIterator()等

然後,得到解析的xml內容xmlWriter.append(xmlHeader)、xmlWriter.append(personsList.get(i).toString())

解析一:標準解析(Iterator 叠代

Code

	/** Dom4j方式,解析 XML  */
	public String dom4jXMLResolve(){
		StringWriter xmlWriter = new StringWriter();
		
		InputStream is = readXML(fileName);
		try {
			SAXReader reader = new SAXReader();
			org.dom4j.Document doc = reader.read(is);

			List<Person> personsList = null;
			Person person = null;
			StringBuffer xmlHeader = new StringBuffer();
			
			
			Element eleRoot = doc.getRootElement();		// 獲得root根節點,引用類為 org.dom4j.Element
			String attrAuthor = eleRoot.attributeValue("author");
			String attrDate = eleRoot.attributeValue("date");
			xmlHeader.append("root").append("\t\t");
			xmlHeader.append(attrAuthor).append("\t");
			xmlHeader.append(attrDate).append("\n");
			personsList = new ArrayList<Person>();
			
			// 獲取root子節點,即person
			Iterator<Element> iter = eleRoot.elementIterator();
			for(; iter.hasNext(); ) {
				Element elePerson = (Element)iter.next();
				
				if("person".equals(elePerson.getName())){
					person = new Person();
					
					// 獲取person子節點,即id、name、blog
					Iterator<Element> innerIter = elePerson.elementIterator();
					for(; innerIter.hasNext();) {
						Element ele = (Element)innerIter.next();
						
						if("id".equals(ele.getName())) {
							String id = ele.getText();
							person.setId(Integer.parseInt(id));
						} else if("name".equals(ele.getName())) {
							String name = ele.getText();
							person.setName(name);
						} else if("blog".equals(ele.getName())) {
							String blog = ele.getText();
							person.setBlog(blog);
						}
					}
					
					personsList.add(person);
					person = null;
				}
			}
			
			xmlWriter.append(xmlHeader);
			int personsLen = personsList.size();
			for(int i=0; i<personsLen; i++) {
				xmlWriter.append(personsList.get(i).toString());
			}
			
		} catch (DocumentException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return xmlWriter.toString();
	}

運行結果:

技術分享圖片

解析二:選擇性解析(XPath路徑

Dom4j+XPath,選擇性只解析id,doc.selectNodes("//root//person//id")

Code

	/** Dom4j方式,解析 XML(方式二)  */
	public String dom4jXMLResolve2(){
		StringWriter xmlWriter = new StringWriter();
		
		InputStream is = readXML(fileName);
		try {
			org.dom4j.io.SAXReader reader = new org.dom4j.io.SAXReader();
			org.dom4j.Document doc = reader.read(is);

			List<Person> personsList = null;
			Person person = null;
			StringBuffer xmlHeader = new StringBuffer();
			
			
			Element eleRoot = doc.getRootElement();		// 獲得root根節點,引用類為 org.dom4j.Element
			String attrAuthor = eleRoot.attributeValue("author");
			String attrDate = eleRoot.attributeValue("date");
			xmlHeader.append("root").append("\t\t");
			xmlHeader.append(attrAuthor).append("\t");
			xmlHeader.append(attrDate).append("\n");
			personsList = new ArrayList<Person>();
			
			@SuppressWarnings("unchecked")
			List<Element> idList = (List<Element>) doc.selectNodes("//root//person//id");	// 選擇性獲取全部id
			Iterator<Element> idIter = idList.iterator();
			while(idIter.hasNext()){
				person = new Person();
				
				Element idEle = (Element)idIter.next();
				String id = idEle.getText();
				person.setId(Integer.parseInt(id));
				
				personsList.add(person);
			}

			xmlWriter.append(xmlHeader);
			int personsLen = personsList.size();
			for(int i=0; i<personsLen; i++) {
				xmlWriter.append("id = ").append(personsList.get(i).getId()+"").append("\n");
			}
			
		} catch (DocumentException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return xmlWriter.toString();
	}

註:借助 XPath 解析 XML 時,需要導入 jaxen;本示例需要導入的是最新的jaxen包jaxen-1.1.3.jar,可以下載本示例下面【源碼下載】或 訪問 jaxen jar

Jaxen is an open source XPath library written in Java. It is adaptable to many different object models, including DOM, XOM, dom4j, and JDOM. Is it also possible to write adapters that treat non-XML trees such as compiled Java byte code or Java beans as XML, thus enabling you to query these trees with XPath too.

jaxen 官方網址:jaxen

jaxen下載jar包:jaxen jar 或 jaxen jar

jaxen源碼查看:jaxen src 或 jaxen trunk

運行結果:

技術分享圖片

4、Person類

請參見前面博客 Android 創建與解析XML(二)—— Dom方式 【4、Person類】

源碼下載

參考推薦:

dom4j(官方網站)

dom4j src(源碼下載)

dom4j src and jar(google code

jaxen(jaxen 官方網址)

jaxen jar(jaxen jar包下載)

jaxen src(jaxen在線源碼)

dom4j 解析 XML(IBM)

dom4j和XPath解析XML

dom4j 屬性值回車換行問題

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net

Android 創建與解析XML(五)—— Dom4j方式