android之dom解析xml

android之dom解析xml_第1张图片

好吧,我们还是来实现这张图的效果,只不过技术我们改为了dom,至于这里的图片上为什么显示的是sax解析,我只能说,哎,没办法,我想偷懒啊。嘿嘿……再看代码结构图:

android之dom解析xml_第2张图片

main.xml

beauties.xml

林志玲 28 杨幂 23

activity的代码:

package cn.com.dom; import java.io.InputStream; import java.util.ArrayList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; /** * * @author chenzheng_java * @description 使用dom解析xml * @since 2011/03/04 * */ public class DomParseXmlTest extends Activity { // 存储最终在前台显示的内容 private String result = ""; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); InputStream inputStream = this.getClassLoader().getResourceAsStream( "beauties.xml"); try { DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(inputStream); // 获取根节点 Element root = document.getDocumentElement(); parse(root); for (Beauty b : beautyList) { result += b.toString(); } TextView textView = (TextView) findViewById(R.id.textView); textView.setText(result); } catch (Exception e) { e.printStackTrace(); } } private Beauty beauty = null; private ArrayList beautyList = new ArrayList(); /** * * @param element 将要进行遍历的节点 */ private void parse(Element element) { NodeList nodelist = element.getChildNodes(); int size = nodelist.getLength(); for (int i = 0; i < size; i++) { // 获取特定位置的node Node element2 = (Node) nodelist.item(i); /* getNodeName获取tagName,例如thinking in android这个Element的getNodeName返回book * getNodeType返回当前节点的确切类型,如Element、Attr、Text等 * getNodeValue 返回节点内容,如果当前为Text节点,则返回文本内容;否则会返回null * getTextContent 返回当前节点以及其子代节点的文本字符串,这些字符串会拼成一个字符串给用户返回。例如 * 对thinking in android12.23调用此方法,则会返回“thinking in android12.23” */ String tagName = element2.getNodeName(); if (tagName.equals("beauty") && element2.getNodeType() == Document.ELEMENT_NODE) { beauty = new Beauty(); Log.i("通知:", "创建beauty"); if (element2.getNodeType() == Document.ELEMENT_NODE) { parse((Element) element2); } Log.i("通知:", "添加beauty"); beautyList.add(beauty); } if (tagName.equals("name")) { String name = element2.getTextContent(); Log.i("通知:", "name" + name); beauty.setName(name); } if (tagName.equals("age")) { String age = element2.getTextContent(); Log.i("通知:", "age" + age); beauty.setAge(age); } } } /** * * @author chenzheng_java 这里使用内部类是为了效率考虑,内部类要比单独顶一个bean类更加的高效以及节约空间 * */ private class Beauty { String name; String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public String toString() { return "美女资料 [年龄=" + age + ", 姓名=" + name + "]"; } } }

其他都为默认。执行,然后就可以看到正确的结果了

----------------------------------------------------------------------------------

写博客的时候,不总结几句废话的孩子不是好孩子。所以,我决定还是说几句:

DOM解析虽然我们在android中并不推荐使用,但是这并不代表着不可以实现。dom的原理是把xml文件的各种部分都看成是节点,所有的节点因为层级关系最后形成了一颗节点树。而DOM的解析方式便是在内存中生存这棵树,并允许用户进行相关的操作。

      这里列出几个dom中经常用到的方法

Node 接口的常用方法
一个节点可以调用
short getNodeType()
方法返回一个表示节点类型的常量(Node接口规定的常量值),例如,对于Element节点,getNodeType()方法返回的值为:
Node.ELEMENT_NODE
节点可以调用
NodeList  getChildNodes()
返回一个由当前节点的所有子节点组成的NodeList对象。节点调用
Node  getFirstChild()
返回当前节点的第一个子节点。节点调用
Node  getLastChild()
返回当前节点的最后一个子节点。节点可以调用
NodeList  getTextContent()
返回当前节点及所有子孙节点中的文本内容。

还有其他的很多很多方法,我们可以通过api来详细了解。因为这里主要是为了学习android,所以关于dom稍微了解下就可以了。

 

你可能感兴趣的:(android_数据增删查改)