TShopping

 找回密碼
 註冊
搜索
查看: 205|回復: 0

[教學] Android 創建與解析XML(二)—— Dom方式

[複製鏈接]
發表於 2016-2-4 15:00:07 | 顯示全部樓層 |閱讀模式
 
Push to Facebook Push to Plurk Push to Twitter 

1. Dom概述

Dom方式創建XML,應用了標準xml構造器  javax.xml.parsers.DocumentBuilder來創建XML文檔,需要導入以下內容

javax.xml.parsers

javax.xml.parsers.DocumentBuilder
javax.xml.parsers.DocumentBuilderFactory
javax.xml.parsers.ParserConfigurationException;
javax.xml.transform
javax.xml.transform.TransformerFactory
javax.xml.transform.Transformer
javax.xml.transform.dom.DOMSource
javax.xml.transform.stream.StreamResult
javax.xml.transform.OutputKeys;
javax.xml.transform.TransformerFactoryConfigurationError;
javax.xml.transform.TransformerConfigurationException;
javax.xml.transform.TransformerException;

org.w3c.dom

org.w3c.dom.Document;
org.w3c.dom.Element;
org.w3c.dom.Node;
org.w3c.dom.DOMException;
org.w3c.dom.NodeList;

org.xml.sax.SAXException;

sdk源碼查看路徑(google code


創建和解析xml的效果圖:




2、Dom 創建XML

Dom,借助javax.xml.parsers.DocumentBuilder,可以創建org.w3c.dom.Document 對象。

使用來自DocumentBuilderFactory 的DocumentBuilder 對像在Android 設備上創建與解析XML 文檔。您將使用XML pull 解析器的擴展來解析XML 文檔。

  1. /** Dom方式,創建 XML */
  2.         public String domCreateXML() {
  3.                 String xmlWriter = null;
  4.                
  5.                 Person []persons = new Person[3];               //創建節點Person對象  
  6.                 persons[0] = new Person(1, "sunboy_2050", "http://blog.csdn.net/sunboy_2050");
  7.                 persons[1] = new Person(2, "baidu", "http://www.baidu.com");
  8.                 persons[2] = new Person(3, "google", "http://www.google.com");
  9.                
  10.                 try {
  11.                         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  12.                         DocumentBuilder builder = factory.newDocumentBuilder();
  13.                         Document doc = builder.newDocument();
  14.                         
  15.                         Element eleRoot = doc.createElement("root");
  16.                         eleRoot.setAttribute("author", "homer");
  17.                         eleRoot.setAttribute("date", "2012-04-26");
  18.                         doc.appendChild(eleRoot);
  19.                         
  20.                         int personsLen = persons.length;
  21.                         for(int i=0; i<personsLen; i++) {
  22.                                 Element elePerson = doc.createElement("person");
  23.                                 eleRoot.appendChild(elePerson);
  24.                                 
  25.                                 Element eleId = doc.createElement("id");
  26.                                 Node nodeId = doc.createTextNode(persons[i].getId() + "");
  27.                                 eleId.appendChild(nodeId);
  28.                                 elePerson.appendChild(eleId);

  29.                                 Element eleName = doc.createElement("name");
  30.                                 Node nodeName = doc.createTextNode(persons[i].getName());
  31.                                 eleName.appendChild(nodeName);
  32.                                 elePerson.appendChild(eleName);

  33.                                 Element eleBlog = doc.createElement("blog");
  34.                                 Node nodeBlog = doc.createTextNode(persons[i].getBlog());
  35.                                 eleBlog.appendChild(nodeBlog);
  36.                                 elePerson.appendChild(eleBlog);
  37.                         }
  38.                         
  39.                         
  40.                         Properties properties = new Properties();
  41.                         properties.setProperty(OutputKeys.INDENT, "yes");
  42.                         properties.setProperty(OutputKeys.MEDIA_TYPE, "xml");
  43.                         properties.setProperty(OutputKeys.VERSION, "1.0");
  44.                         properties.setProperty(OutputKeys.ENCODING, "utf-8");
  45.                         properties.setProperty(OutputKeys.METHOD, "xml");
  46.                         properties.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
  47.                         
  48.                         TransformerFactory transformerFactory = TransformerFactory.newInstance();
  49.                         Transformer transformer = transformerFactory.newTransformer();
  50.                         transformer.setOutputProperties(properties);
  51.                         
  52.                         DOMSource domSource = new DOMSource(doc.getDocumentElement());
  53.                         OutputStream output = new ByteArrayOutputStream();
  54.                         StreamResult result = new StreamResult(output);
  55.                         transformer.transform(domSource, result);
  56.                         
  57.                         xmlWriter = output.toString();
  58.                         
  59.                 } catch (ParserConfigurationException e) {                // factory.newDocumentBuilder
  60.                         e.printStackTrace();
  61.                 } catch (DOMException e) {                                                // doc.createElement
  62.                         e.printStackTrace();
  63.                 } catch (TransformerFactoryConfigurationError e) {                // TransformerFactory.newInstance
  64.                         e.printStackTrace();
  65.                 } catch (TransformerConfigurationException e) {                // transformerFactory.newTransformer
  66.                         e.printStackTrace();
  67.                 } catch (TransformerException e) {                                // transformer.transform
  68.                         e.printStackTrace();
  69.                 } catch (Exception e) {
  70.                         e.printStackTrace();
  71.                 }
  72.                
  73.                 savedXML(fileName, xmlWriter.toString());
  74.                
  75.                 return xmlWriter.toString();
  76.         }
複製代碼

運行結果:


1.PNG



3、Dom 解析XML

Dom方式,解析XML是創建XML的逆過程,主要用到了builder.parse(is)進行解析,然後通過Tag、NodeList、Element、childNotes等得到Element和Node屬性或值。

  1. /** Dom方式,解析 XML  */
  2.         public String domResolveXML() {
  3.                 StringWriter xmlWriter = new StringWriter();
  4.                
  5.                 InputStream is= readXML(fileName);
  6.                 try {
  7.                         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  8.                         DocumentBuilder builder = factory.newDocumentBuilder();
  9.                         Document doc = builder.parse(is);

  10.                         doc.getDocumentElement().normalize();
  11.                         NodeList nlRoot = doc.getElementsByTagName("root");
  12.                         Element eleRoot = (Element)nlRoot.item(0);
  13.                         String attrAuthor = eleRoot.getAttribute("author");
  14.                         String attrDate = eleRoot.getAttribute("date");
  15.                         xmlWriter.append("root").append("\t\t");
  16.                         xmlWriter.append(attrAuthor).append("\t");
  17.                         xmlWriter.append(attrDate).append("\n");
  18.                         
  19.                         NodeList nlPerson = eleRoot.getElementsByTagName("person");
  20.                         int personsLen = nlPerson.getLength();
  21.                         Person []persons = new Person[personsLen];
  22.                         for(int i=0; i<personsLen; i++) {
  23.                                 Element elePerson = (Element) nlPerson.item(i);                // person節點  
  24.                                 Person person = new Person();                                               //創建Person對象  
  25.                                 
  26.                                 NodeList nlId = elePerson.getElementsByTagName("id");
  27.                                 Element eleId = (Element)nlId.item(0);
  28.                                 String id = eleId.getChildNodes().item(0).getNodeValue();
  29.                                 person.setId(Integer.parseInt(id));
  30.                                 
  31.                                 NodeList nlName = elePerson.getElementsByTagName("name");
  32.                                 Element eleName = (Element)nlName.item(0);
  33.                                 String name = eleName.getChildNodes().item(0).getNodeValue();
  34.                                 person.setName(name);
  35.                                 
  36.                                 NodeList nlBlog = elePerson.getElementsByTagName("blog");
  37.                                 Element eleBlog = (Element)nlBlog.item(0);
  38.                                 String blog = eleBlog.getChildNodes().item(0).getNodeValue();
  39.                                 person.setBlog(blog);
  40.                                 
  41.                                 xmlWriter.append(person.toString()).append("\n");
  42.                                 persons[i] = person;
  43.                         }
  44.                         
  45.                 } catch (ParserConfigurationException e) {                // factory.newDocumentBuilder
  46.                         e.printStackTrace();
  47.                 } catch (SAXException e) {                // builder.parse
  48.                         e.printStackTrace();
  49.                 } catch (IOException e) {                // builder.parse
  50.                         e.printStackTrace();
  51.                 } catch (Exception e) {
  52.                         e.printStackTrace();
  53.                 }
  54.                
  55.                 return xmlWriter.toString();
  56.         }
複製代碼

運行結果:


2.png



4、Person類

Person類,是創建xml的單位實例,基於Java面向對象定義的一個類

  1. public class Person {
  2.         private int id;
  3.         private String name;
  4.         private String blog;
  5.        
  6.         public Person() {
  7.                 this.id = -1;
  8.                 this.name = "";
  9.                 this.blog = "";
  10.         }

  11.         public Person(int id, String name, String blog) {
  12.                 this.id = id;
  13.                 this.name = name;
  14.                 this.blog = blog;
  15.         }
  16.        
  17.         public Person(Person person) {
  18.                 this.id = person.id;
  19.                 this.name = person.name;
  20.                 this.blog = person.blog;
  21.         }

  22.         public Person getPerson(){
  23.                 return this;
  24.         }
  25.        
  26.         public void setId(int id) {
  27.                 this.id = id;
  28.         }
  29.        
  30.         public int getId(){
  31.                 return this.id;
  32.         }
  33.        
  34.         public void setName(String name) {
  35.                 this.name = name;
  36.         }

  37.         public String getName() {
  38.                 return this.name;
  39.         }

  40.         public void setBlog(String blog) {
  41.                 this.blog = blog;
  42.         }

  43.         public String getBlog() {
  44.                 return this.blog;
  45.         }

  46.         public String toString() {
  47.                 return "Person \nid = " + id + "\nname = " + name + "\nblog = " + blog + "\n";
  48.         }
  49. }
複製代碼

代碼下載


 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2016-12-9 01:52 , Processed in 0.060449 second(s), 25 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表