Android开发(8)--Android中DOM解析xml文件

来源:互联网 发布:mysql 修复数据库 编辑:程序博客网 时间:2024/05/02 02:53

一、在assets文件中写xml文件

[html] view plaincopy
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <persons>
  3. <personid="23">
  4. <name>李明</name>
  5. <age>30</age>
  6. </person>
  7. <personid="20">
  8. <name>李向梅</name>
  9. <age>25</age>
  10. </person>
  11. </persons>
[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <persons>  
  3.     <person id="23">  
  4.         <name>李明</name>  
  5.         <age>30</age>  
  6.     </person>  
  7.     <person id="20">  
  8.         <name>李向梅</name>  
  9.         <age>25</age>  
  10.     </person>  
  11. </persons>  


二、在service中写一个DOM解析的操作

[java] view plaincopy
  1. package com.example.service;

  2. import java.io.InputStream;
  3. import java.util.ArrayList;
  4. import java.util.List;

  5. import javax.xml.parsers.DocumentBuilder;
  6. import javax.xml.parsers.DocumentBuilderFactory;

  7. import org.w3c.dom.Document;
  8. import org.w3c.dom.Element;
  9. import org.w3c.dom.Node;
  10. import org.w3c.dom.NodeList;

  11. import com.example.domain.Person;



  12. public class XMLDomService {

  13. public List<Person> parseXML(InputStream is) {

  14. List<Person> list = new ArrayList<Person>();

  15. // 创建DOM工厂对象
  16. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

  17. try {
  18. // DocumentBuilder对象
  19. DocumentBuilder builder = factory.newDocumentBuilder();

  20. // 获取文档对象
  21. Document document = builder.parse(is);

  22. // 获取文档对象的root
  23. Element root = document.getDocumentElement();

  24. // 获取persons根节点中所有的person节点对象

  25. NodeList personNodes = root.getElementsByTagName("person");

  26. // 遍历所有的person节点

  27. for (int i =0; i < personNodes.getLength(); i++) {
  28. Person person = new Person();
  29. // 根据item(index)获取该索引对应的节点对象
  30. Element personNode = (Element) personNodes.item(i); // 具体的person节点
  31. // 设置id属性值
  32. person.setId(Integer.parseInt(personNode.getAttribute("id")));

  33. // 获取该节点下面的所有字节点
  34. NodeList personChildNodes = personNode.getChildNodes();

  35. // 遍历person的字节点
  36. for (int index =0; index < personChildNodes.getLength(); index++) {
  37. // 获取子节点
  38. Node node = personChildNodes.item(index);

  39. // 判断node节点是否是元素节点
  40. if (node.getNodeType() == Node.ELEMENT_NODE) {
  41. //把节点转换成元素节点
  42. Element element = (Element) node;

  43. //判断元素节点是否是name元素节点
  44. if ("name".equals(element.getNodeName())) {
  45. person.setName(element.getFirstChild()
  46. .getNodeValue());
  47. } else if ("age".equals(element.getNodeName())) {//判断是否是age节点
  48. person.setAge(new Short(element.getFirstChild()
  49. .getNodeValue()));
  50. }
  51. }

  52. }

  53. // 把person对象加入到集合中
  54. list.add(person);

  55. }
  56. //关闭输入流
  57. is.close();

  58. } catch (Exception e) {
  59. // TODO Auto-generated catch block
  60. e.printStackTrace();
  61. }

  62. return list;
  63. }
  64. }
[java] view plaincopy
  1. package com.example.service;  
  2.   
  3. import java.io.InputStream;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import javax.xml.parsers.DocumentBuilder;  
  8. import javax.xml.parsers.DocumentBuilderFactory;  
  9.   
  10. import org.w3c.dom.Document;  
  11. import org.w3c.dom.Element;  
  12. import org.w3c.dom.Node;  
  13. import org.w3c.dom.NodeList;  
  14.   
  15. import com.example.domain.Person;  
  16.   
  17.   
  18.   
  19. public class XMLDomService {  
  20.   
  21.     public List<Person> parseXML(InputStream is) {  
  22.   
  23.         List<Person> list = new ArrayList<Person>();  
  24.   
  25.         // 创建DOM工厂对象  
  26.         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  27.   
  28.         try {  
  29.             // DocumentBuilder对象  
  30.             DocumentBuilder builder = factory.newDocumentBuilder();  
  31.   
  32.             // 获取文档对象  
  33.             Document document = builder.parse(is);  
  34.   
  35.             // 获取文档对象的root  
  36.             Element root = document.getDocumentElement();  
  37.   
  38.             // 获取persons根节点中所有的person节点对象  
  39.   
  40.             NodeList personNodes = root.getElementsByTagName("person");  
  41.   
  42.             // 遍历所有的person节点  
  43.   
  44.             for (int i = 0; i < personNodes.getLength(); i++) {  
  45.                 Person person = new Person();  
  46.                 // 根据item(index)获取该索引对应的节点对象  
  47.                 Element personNode = (Element) personNodes.item(i); // 具体的person节点  
  48.                 // 设置id属性值  
  49.                 person.setId(Integer.parseInt(personNode.getAttribute("id")));  
  50.   
  51.                 // 获取该节点下面的所有字节点  
  52.                 NodeList personChildNodes = personNode.getChildNodes();  
  53.   
  54.                 // 遍历person的字节点  
  55.                 for (int index = 0; index < personChildNodes.getLength(); index++) {  
  56.                     // 获取子节点  
  57.                     Node node = personChildNodes.item(index);  
  58.   
  59.                     // 判断node节点是否是元素节点  
  60.                     if (node.getNodeType() == Node.ELEMENT_NODE) {  
  61.                         //把节点转换成元素节点  
  62.                         Element element = (Element) node;  
  63.   
  64.                         //判断元素节点是否是name元素节点  
  65.                         if ("name".equals(element.getNodeName())) {  
  66.                             person.setName(element.getFirstChild()  
  67.                                     .getNodeValue());  
  68.                         } else if ("age".equals(element.getNodeName())) { //判断是否是age节点  
  69.                             person.setAge(new Short(element.getFirstChild()  
  70.                                     .getNodeValue()));  
  71.                         }  
  72.                     }  
  73.   
  74.                 }  
  75.   
  76.                 // 把person对象加入到集合中  
  77.                 list.add(person);  
  78.   
  79.             }  
  80.             //关闭输入流  
  81.             is.close();  
  82.   
  83.         } catch (Exception e) {  
  84.             // TODO Auto-generated catch block  
  85.             e.printStackTrace();  
  86.         }  
  87.   
  88.         return list;  
  89.     }  
  90. }  


三、在Activity中显示操作

[java] view plaincopy
  1. package com.example.lession03_xml;

  2. import java.io.InputStream;
  3. import java.util.List;


  4. import javax.xml.parsers.SAXParser;
  5. import javax.xml.parsers.SAXParserFactory;

  6. import com.example.domain.Person;
  7. import com.example.service.XMLContentHandler;
  8. import com.example.service.XMLDomService;



  9. import android.os.Bundle;
  10. import android.app.Activity;
  11. import android.view.Menu;
  12. import android.view.View;
  13. import android.view.View.OnClickListener;
  14. import android.view.inputmethod.InputBinding;
  15. import android.widget.Button;
  16. import android.widget.Toast;

  17. public class XmlActivityextends Activity {

  18. //声明组件
  19. public Button btn_sax,btn_dom,btn_pull;

  20. public XMLDomService xmlDomService;

  21. @Override
  22. protected void onCreate(Bundle savedInstanceState) {
  23. super.onCreate(savedInstanceState);
  24. //设置显示的视图
  25. setContentView(R.layout.activity_xml);

  26. xmlDomService=new XMLDomService();
  27. //根据id获取组件
  28. btn_sax=(Button) findViewById(R.id.btn_sax);
  29. btn_dom=(Button) findViewById(R.id.btn_dom);
  30. btn_pull=(Button) findViewById(R.id.btn_pull);

  31. //为按钮注册事件
  32. btn_sax.setOnClickListener(new MyOnclickListener());
  33. btn_dom.setOnClickListener(new MyOnclickListener());
  34. btn_pull.setOnClickListener(new MyOnclickListener());
  35. }

  36. @Override
  37. public boolean onCreateOptionsMenu(Menu menu) {
  38. // Inflate the menu; this adds items to the action bar if it is present.
  39. getMenuInflater().inflate(R.menu.xml, menu);
  40. return true;
  41. }

  42. //匿名类
  43. class MyOnclickListener implements OnClickListener{

  44. @Override
  45. public void onClick(View v) {
  46. int id=v.getId();
  47. switch (id) {
  48. case R.id.btn_sax:
  49. Toast.makeText(XmlActivity.this,"采用SAX解析", Toast.LENGTH_LONG).show();
  50. try{
  51. //SAX解析的工厂对象
  52. SAXParserFactory factory=SAXParserFactory.newInstance();
  53. //得到sax的解析器
  54. SAXParser saxParser=factory.newSAXParser();
  55. //创建handler对象
  56. XMLContentHandler handlerService=new XMLContentHandler();
  57. InputStream is=getAssets().open("csdn.xml");
  58. //直接解析
  59. saxParser.parse(is, handlerService);
  60. //通过handlerService对象获取
  61. Toast.makeText(XmlActivity.this,"----"+handlerService, Toast.LENGTH_LONG).show();
  62. }catch(Exception e){
  63. e.printStackTrace();
  64. }

  65. break;
  66. case R.id.btn_dom:

  67. InputStream is=null;
  68. try{
  69. //获取读取文件的输入流对象
  70. is=getAssets().open("csdn.xml");
  71. //采用dom解析
  72. List<Person> persons=xmlDomService.parseXML(is);
  73. //简单测试
  74. //Toast.makeText(XmlActivity.this, ""+persons.get(0).getName(), Toast.LENGTH_LONG).show();
  75. Toast.makeText(XmlActivity.this,"采用DOM解析"+persons.get(0).getName(), Toast.LENGTH_LONG).show();
  76. }catch(Exception e){
  77. e.printStackTrace();
  78. }


  79. break;
  80. case R.id.btn_pull:
  81. Toast.makeText(XmlActivity.this,"采用PULL解析", Toast.LENGTH_LONG).show();
  82. break;

  83. default:
  84. break;
  85. }

  86. }

  87. }
  88. }