Android中DOM解析XML文件

来源:互联网 发布:锥度计算软件 编辑:程序博客网 时间:2024/05/22 14:32

一、在assets文件中写xml文件

[html] view plaincopyprint?
  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>


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

[java] view plaincopyprint?
  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. publicclass 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. } elseif ("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. }


三、在Activity中显示操作

[java] view plaincopyprint?
  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. publicclass XmlActivityextends Activity {
  18. //声明组件
  19. public Button btn_sax,btn_dom,btn_pull;
  20. public XMLDomService xmlDomService;
  21. @Override
  22. protectedvoid 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. publicboolean 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. returntrue;
  41. }
  42. //匿名类
  43. class MyOnclickListenerimplements OnClickListener{
  44. @Override
  45. publicvoid 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. }