DOM解析XML文件时,会将XML文件的所有内容以对象树方式存放在内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。

使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单。

但是,因为DOM需要将XML文件的所有内容以对象树方式存放在内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小采用DOM是可行的。

Strings.xml

<?xml version="1.0" encoding="utf-8"?><resources>    <string name="app_name">lession03_xml</string>    <string name="action_settings">Settings</string>    <string name="hello_world">Hello world!</string>    <string name="btn_sax">采用sax解析xml文件</string>    <string name="btn_dom">采用dom解析方式解析</string>    <string name="btn_pull">采用pull解析方式解析</string>    <string name="btn_cpull">采用pull解析生成xml文件</string></resources>


activity_xml.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".XmlActivity" >    <Button        android:id="@+id/button_cpull"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignLeft="@+id/btn_pull"        android:layout_alignRight="@+id/btn_pull"        android:layout_below="@+id/btn_pull"        android:layout_marginTop="20dp"        android:text="@string/btn_cpull" />    <Button        android:id="@+id/btn_sax"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentLeft="true"        android:layout_alignParentRight="true"        android:text="@string/btn_sax" />    <Button        android:id="@+id/btn_pull"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignLeft="@+id/btn_dom"        android:layout_alignRight="@+id/btn_dom"        android:layout_below="@+id/btn_dom"        android:layout_marginTop="68dp"        android:text="@string/btn_pull" />    <Button        android:id="@+id/btn_dom"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignLeft="@+id/btn_sax"        android:layout_alignRight="@+id/btn_sax"        android:layout_below="@+id/btn_sax"        android:layout_marginTop="60dp"        android:text="@string/btn_dom" /></RelativeLayout>

Person.java

package com.example.lession03_xml.domain;import java.io.Serializable;/** * 创建一个javabean存储xml解析的数据 *  * @author chenhj *  */public class Person implements Serializable {/** *  */private static final long serialVersionUID = 1L;private int id;private String name;private short age;public Person() {super();// TODO Auto-generated constructor stub}public Person(int id, String name, short age) {super();this.id = id;this.name = name;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public short getAge() {return age;}public void setAge(short age) {this.age = age;}}

XMLDomService.java

package com.example.lession03_xml.service;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.DocumentFragment;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import com.example.lession03_xml.domain.Person;public class XMLDomService {public List<Person> parseXML(InputStream inStream) {List<Person> list = new ArrayList<Person>();// 创建dom工厂对象DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();try {// DocumentBuilder对象DocumentBuilder builder = factory.newDocumentBuilder();// 传过来instrean文件,得到document文档对象Document document = builder.parse(inStream);// 获取文档对象的根rootElement root = document.getDocumentElement();// 获取person根节点中所有的person子节点NodeList items = root.getElementsByTagName("person");// 便利所有的 person节点for (int i = 0; i < items.getLength(); i++) {Person person = new Person();// 得到第一个person节点Element personNode = (Element) items.item(i);// 获取person节点的id属性值person.setId(new Integer(personNode.getAttribute("id")));// 获取person节点下的所有子节点(标签之间的空白节点和name/age元素)NodeList childsNodes = personNode.getChildNodes();// 遍历person的子节点for (int index = 0; index < childsNodes.getLength(); index++) {// 获取子节点Node node = (Node) childsNodes.item(index);// 判断是否为元素类型,是不是元素节点if (node.getNodeType() == Node.ELEMENT_NODE) {//是元素节点需要造型Element childNode = (Element) node;// 判断是否name元素if ("name".equals(childNode.getNodeName())) {// 获取name元素下Text节点,然后从Text节点获取数据 person.setName(childNode.getFirstChild().getNodeValue());} else if ("age".equals(childNode.getNodeName())) {person.setAge(new Short(childNode.getFirstChild().getNodeValue()));}}}//把person对象加入到集合当中list.add(person);}inStream.close();} catch (Exception e) {e.printStackTrace();}return list;}}


XmlActivity.java

package com.example.lession03_xml;import java.io.InputStream;import java.util.List;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import com.example.lession03_xml.domain.Person;import com.example.lession03_xml.service.XMLContentHandlerService;import com.example.lession03_xml.service.XMLDomService;import com.example.lession03_xml.service.XMLPullService;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;import android.widget.Button;import android.widget.Toast;public class XmlActivity extends Activity {// 声明控件public Button btn_sax, btn_dom, btn_pull, btn_cpull;public XMLDomService xmlDomService;public XMLPullService xmlPullService;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 设置显示的视图setContentView(R.layout.activity_xml);// 实例化xmlDomService = new XMLDomService();xmlPullService = new XMLPullService();// 通过findViewById方法获取控件对象btn_sax = (Button) findViewById(R.id.btn_sax);btn_dom = (Button) findViewById(R.id.btn_dom);btn_pull = (Button) findViewById(R.id.btn_pull);btn_cpull = (Button) findViewById(R.id.button_cpull);// 给按钮注册事件btn_sax.setOnClickListener(new MyClickListener());btn_dom.setOnClickListener(new MyClickListener());btn_pull.setOnClickListener(new MyClickListener());btn_cpull.setOnClickListener(new MyClickListener());}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.xml, menu);return true;}class MyClickListener implements View.OnClickListener {@Overridepublic void onClick(View v) {// 获取组件的idint id = v.getId();switch (id) {case R.id.btn_sax:break;case R.id.btn_dom:InputStream is = null;try {// 获取读取文件的输入流对象is = getAssets().open("csdn.xml");// 采用List<Person> persons = xmlDomService.parseXML(is);//Toast.makeText(XmlActivity.this,"" + persons.get(0).getName(), Toast.LENGTH_LONG).show();} catch (Exception e) {e.printStackTrace();}break;case R.id.btn_pull:break;case R.id.button_cpull:}}}}


更多相关文章

  1. android volley解析与二次封装
  2. Android获取root权限的利弊关系
  3. android 获取网络图片缓存(内存—>文件—>网络)
  4. 混合开发H5页面嵌入ios/Android及echarts图表问题总结
  5. (转)支付宝 Android(安卓)版使用的开源组件
  6. Android(安卓)获取所有联系人(两种方法)
  7. Android(安卓)8.0 以上获取设备序列号, Android(安卓)4.4 - Andro
  8. Android之微信分享
  9. Android中px, ppi, dpi, dp, dip, sp概念解析

随机推荐

  1. 活用Android的Message Queue(2)
  2. Android实现左右滑动效果
  3. Android属性动画(三) TimeInterpolator(插值
  4. Activity 的四种加载模式
  5. 在Android Studio中使用Android-PullToRe
  6. Android 开发经验传承
  7. Camera服务之--架构浅析
  8. Android(安卓)高通平台camera hal层调试
  9. 建立android新工程
  10. Android 用Mediacodec硬解码视频包AVpack