快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡亰集团平台网址大全_龟发之家论坛



媒介

前面已经先容了Android平台下两种解析XML的措施,SAX和PULL,这两个均为事故驱动,以流的形式解析XML文档。现在先容一种新的要领DOM要领解析XML。

DOM是一种用于XML文档工具模型,可用于直接造访XML文档的各个部位,在DOM中文档被模拟成树状,此中XML语法的每一组成部分都表示一个节点,DOM容许用户遍历文档树,从父节点移动到子节点和兄弟节点。并使用某节点类型特有的属性(元素具有属性,文本节点具有文本数据)。

对付DOM而言,XML文档中每一个因素都是一个节点。

DOM是这样规定的:

全部文档是一个文档节点。

每一个XML标签是一个元素节点。

包孕在XML元素中的文本是一个文本节点。

每一个XML属性是一个属性节点。

DOM解析XML

DOM解析XML也是必要一个工厂类DocumentBuilderFactory,这一点和SAX、PULL类似。工厂类也是单例模式,没有供给共有的构造函数,必要应用静态的newInstance()措施得到,并且必要工厂类来获取DOM解析器实例,应用DocumentBuilderFactory.newDocumentBuilder()得到的DocumentBuilder工具。

当得到Document之后,就可以应用parse()解析XML文档,parser多个重载,可以适用于不合的输入。

下面先容一下在DOM解析XML历程中,会碰上几个工具,Element、NodeList、Node。说也不太好说清楚,画个图解释一下更直不雅。

从图上可以看出,Element为一个元素,可以经由过程这个元素获取到该元素的属性值(Attribute),以及它的子节点的聚拢NodeList。而NodeList作为一个装载平级节点的聚拢,可以经由过程NodeList得到它内装载的所有平级节点,可以经由过程索引获取。对付Node,表示终极的节点,根据图示说的,着实Jack文本也是一个文本节点(Node),Node可以获取其节点名称、其值、其属性。以是它们三个是可以互相嵌套的,也不存在说谁必然要在谁的外侧或是内层。

示例法度榜样

既然已经说了那么多了,现在经由过程一个示例法度榜样展示一下DOM解析XML。这是一个Android利用法度榜样,为了模拟真实的情况,经由过程收集读取IIS上的一个静态XML文件内容。直接上代码,注释已经写的很清楚了。

IIS上的静态XML文档内容:

xml version="1.0" encoding="utf-8" ?>

- persons> - person id="23">

name>Jackname>age>21age>

person> - person id="20">

name>Dickname>age>23age>

person>persons>

DomService,解析收集传输来的XML文档流:

package cn.bgxt.service;

import java.io.InputStream;

import java.util.ArrayList;import java.util.List;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;

import org.w3c.dom.Element;import org.w3c.dom.Node;

import o澳门新葡亰集团平台网址大全rg.w3c.dom.NodeList;

import cn.bgxt.domain.Person;

public class DomService {

public DomService() {

// TODO Auto-generated constructor stub}

public static List

getPersons(InputStream inputStream) throws Exception

{List

list=new ArrayList

();

//获取工厂工具,以及经由过程DOM工厂工具获取DOMBuilder工具DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

DocumentBuilder builder=factory.newDocumentBuilder();//解析XML输入流,获得Document工具,表示一个XML文档

Document document=builder.parse(inputStream);//得到文档中的次以及节点,persons

Element element=document.getDocumentElement();// 获取Element下一级的person节点聚拢,以NodeList的形式寄放。

NodeList personNodes=element.getElementsByTagName("person");for(int i=0;i

{//轮回获取索引为i的person节点

Element personElement=(Element) personNodes.item(i);Person person=new Person();

//经由过程属性名,获取节点的属性idperson.setId(Integer.parseInt(personElement.getAttribute("id")));

//获取索引i的person节点下的子节点聚拢NodeList childNodes=personElement.getChildNodes();

for(int j=0;j{

//轮回遍历每个person下的子节点,如武判断节点类型是ELEMENT_NODE,就可以依据节点名称给予解析if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE)

{if("name".equals(childNodes.item(j).getNodeName()))

{//由于文本也是一个文本节点,

//以是这里读取到name节点的时刻,//经由过程getFirstChild()可以直接得到name节点的下的第一个节点,便是name节点后的文本节点

//取其value值,便是文本的内容person.setName(childNodes.item(j).getFirstChild().getNodeValue());

}else if("age".e澳门新葡亰集团平台网址大全quals(childNodes.item(j).getNodeName()))

{person.setAge(Integer.parseInt(childNodes.item(j).getFirstChild().getNodeValue()));

}}

}//把解析的person工具加入的list聚拢中

list.add(person);}

return list;}

}

从IIS办事器上获取XML的要领,在别的一篇博客:HTTP协议。中已经先容了,假如不明白可以去看看,这里就不先容了。

Activity的结构便是一个按钮,用于点击启程解析事故,由于是Android4.0+的情况,必要无法在主线程中造访收集,必要应用到多线程的技巧,并且不要网了给Android利用增添造访收集的权限。

package cn.bgxt.xmlfordom;

import java.io.InputStream;

import java.util.List;import cn.bgxt.domain.Person;

import cn.bgxt.http.HttpUtils;import cn.bgxt.service.DomService;

import android.os.Bundle;import android.app.Activity;

import android.util.Log;import android.view.Menu;

import android.view.View;import android.widget.Button;

public class MainActivity extends Activity {

private Button button澳门新葡亰集团平台网址大全;

@Override

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

button=(Button)findViewById(R.id.btn);button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {// Android 4.0+不能在主线程中造访收集

Thread thread=new Thread(new Runnable() {@Override

public void run() {try {

String path="http://192.168.1.107:1231/persons.xml";InputStream inp澳门新葡亰集团平台网址大全utStream=HttpUtils.getXML(path);

Li澳门新葡亰集团平台网址大全st

list=DomService.getPersons(inputStream);for(Person person:list)

{//以日志的形式打印工具内容

Log.i("DOM", person.toString());}

} catch (Exception e) {// TODO: handle exception

}}

});

thread.start();}

});

}

}

假如解析成功,可以在LogCat中查看到日志。

示例法度榜样源码

总结

现在已经解说的常用的Android利用中解析XML的措施,DOM和PULL、SAX不一样,是文档模型形式的,在解析的时刻会把全部XML的内容都读取到内存中,这样对付移动设备而言,是很耗损内存的。而PULL以及SAX都是事故驱动,逐行去解析XML的内容,相对而言包管懂得析速率又不会很损耗内存。以是Android利用中一样平常不保举应用DOM解析XML,照样方向于应用SAX、PULL。然则DOM也有它的优点,正由于它是把全部文档都读取到内存中了,可以指定必要查找的数据而无需遍历所有的节点,对付内容对照少的XML而言,照样很方便的。以是解析XML的措施有很多,无法绝对的阐明谁好谁坏,主要照样看需求设定的情况来取舍的。

您可能还会对下面的文章感兴趣: