android之dom解析xml

来源:互联网 发布:三维定位算法 编辑:程序博客网 时间:2024/06/05 07:35

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

main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    ><TextView      android:layout_width="fill_parent"     android:layout_height="wrap_content"     android:id="@+id/textView"    /></LinearLayout>
解析用的XML文件:
beauties.xml
<?xml version="1.0" encoding="UTF-8"?><beauties><beauty><name>林志玲</name><age>28</age></beauty><beauty><name>杨幂</name><age>23</age></beauty></beauties>
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 = "";@Overridepublic 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<Beauty> beautyList = new ArrayList<Beauty>();/** *  * @param element 将要进行遍历的节点 */private void parse(Element element) {NodeList nodelist = element.getChildNodes();int size = nodelist.getLength();for (int i = 0; i < size; i++) {// 获取特定位置的nodeNode element2 = (Node) nodelist.item(i);/* getNodeName获取tagName,例如<book>thinking in android</book>这个Element的getNodeName返回book * getNodeType返回当前节点的确切类型,如Element、Attr、Text等 * getNodeValue 返回节点内容,如果当前为Text节点,则返回文本内容;否则会返回null * getTextContent 返回当前节点以及其子代节点的文本字符串,这些字符串会拼成一个字符串给用户返回。例如 * 对<book><name>thinking in android</name><price>12.23</price></book>调用此方法,则会返回“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;}@Overridepublic String toString() {return "美女资料 [年龄=" + age + ", 姓名=" + name + "]";}}}

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

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

总结:

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

DOM解析虽然我们在android中并不推荐使用,但是这并不代表着不可以实现。

dom的原理:

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稍微了解下就可以了。



原创粉丝点击