展会信息港展会大全

Android Dom解析xml
来源:互联网   发布日期:2016-01-13 21:57:26   浏览:1272次  

导读:先看一个图:我们来实现这张图的效果,只不过我们改为了dom技术,至于上面的图片上为什么显示的是sax解析而不是xml解析,这个不是主要的,只是个样子而已,看代码结构图:main.xmlLinearLayout xmlns:android=......

先看一个图:

我们来实现这张图的效果,只不过我们改为了dom技术,至于上面的图片上为什么显示的是sax解析而不是xml解析,这个不是主要的,只是个样子而已,看代码结构图:

main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_height="fill_parent"

android:layout_width="fill_parent"

android:orientation="vertical"

>

<TextView

android:id="@+id/textView"

android:layout_height="wrap_content"

android:layout_width="fill_parent"

/>

</LinearLayout>

beauties.xml

<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;

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<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++) {

// 获取特定位置的node

Node 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;

}

@Override

public String toString() {

return "美女资料 [年龄=" + age + ", 姓名=" + name + "]";

}

}

}

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

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

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

Node接口的常用方法

一个节点可以调用

short getNodeType()

方法返回一个表示节点类型的常量(Node接口规定的常量值),例如,对于Element节点,getNodeType()方法返回的值为:

Node.ELEMENT_NODE

节点可以调用

NodeList getChildNodes()

返回一个由当前节点的所有子节点组成的NodeList对象。

节点调用

Node getFirstChild()

返回当前节点的第一个子节点。

节点调用

Node getLastChild()

返回当前节点的最后一个子节点。

节点可以调用

NodeList getTextContent()

返回当前节点及所有子孙节点中的文本内容。

赞助本站

人工智能实验室

相关热词: Dom 解析 xml

AiLab云推荐
推荐内容
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港