android之dom解析xml
【摘要】
好吧,我们还是来实现这张图的效果,只不过技术我们改为了dom,至于这里的图片上为什么显示的是sax解析,我只能说,哎,没办法,我想偷懒啊。嘿嘿……再看代码结构图:
main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns...
好吧,我们还是来实现这张图的效果,只不过技术我们改为了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 = "";
-
-
@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 + "]";
-
}
-
-
}
-
}
其他都为默认。执行,然后就可以看到正确的结果了
----------------------------------------------------------------------------------
总结:
写博客的时候,不总结几句废话的孩子不是好孩子。所以,我决定还是说几句:
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稍微了解下就可以了。
文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。
原文链接:panda1234lee.blog.csdn.net/article/details/8831648
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)