安卓解析XML文件系列3:使用DOM方式

安卓中解析XML文件的方式有三种,下面将第三种方式的使用方法介绍给大家。


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


节点(XML文档中的每一个成分都是一个节点)

DOM是这样规定的:
整个文档是一个节点文档
每一个XML标签是一个元素节点
包含在XML元素中的文本是文本节点
每一个XML属性是一个属性节点

在子节点比较多的时候,使用效率比较低,需要进行多次循环遍历来取出节点进行解析。
从内存占用率来说:SAX和PULL是比DOM占用更少内存的解析方式,更适合Android手机开发。

这个例子实现的是使用DOM方式解析XML文件,将web上一个xml文件解析出语义。

整体思路:新建一个java工程,定义一个实体类Book,在里面定义它的字段、get和set方法、toString方法。定义一个HttpUtils类,在里面定义getXML方法,在这个方法中使用字符串类型的网址实例化HttpURLConnection对象,设置它的超时时间、input方式、请求方式、获取返回码,如果请求完成,则以输入流的形式返回结果的信息。定义一个DomService类,在里面定义getBooks方法,在这个方法中定义一个List对象,创建一个document解析的工厂,创建一个DocumentBuilder对象,把输入流放入DocumentBuilder对象并返回给Document对象,获得稳定的元素节点,对book节点进行遍历,获取id,获取里面的子节点,对里面的子节点进行遍历,如果是name节点的话,获取它的值,并赋值给Book对象的name属性,如果是price节点的话,获取它的值,并赋值给Book对象的price属性,把book对象加入到List对象中,返回List对象。定义一个Test类,定义一个xml文件所在的字符串类型网址,以这个网址为参数调用getXML方法·,返回一个InputStream对象,以InputStream对象为参数调用getBooks方法,返回一个List对象,遍历List对象并将里面的内容信息输出。

Book.java文件:

public class Book {
	
    private int id;
    private String name;
    private float price;
    
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public float getPrice() {
		return price;
	}

	public void setPrice(float price) {
		this.price = price;
	}
    

	@Override
	public String toString() {
		return "Book [id=" + id + ", name=" + name + ", price=" + price + "]";
	}

	public Book() {
		// TODO Auto-generated constructor stub
	}

}
HttpUtils.java文件:

public class HttpUtils {
//从服务器获取xml文件返回流
	public HttpUtils() {
		// TODO Auto-generated constructor stub
	}
	
	public static InputStream getXML(String path){
		InputStream inputStream=null;
		try {
			URL url=new URL(path);
			if(url!=null){
				HttpURLConnection connection=(HttpURLConnection)url.openConnection();
				connection.setConnectTimeout(3000);
				connection.setDoInput(true);
				connection.setRequestMethod("GET");
				int code=connection.getResponseCode();
				if(code==200){
					inputStream=connection.getInputStream();
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return inputStream;
	}

}

DomService.java文件:

public class DomService {

	public DomService() {
		// TODO Auto-generated constructor stub
	}

	public List<Book> getBooks(InputStream inputStream) throws Exception{
		List<Book> list=new ArrayList<Book>();
//		创建一个document解析的工厂
		DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		DocumentBuilder builder=factory.newDocumentBuilder();
//		document表示整个文本的对象
		Document document=builder.parse(inputStream);//有时报错是因为同名的包引用错了
		org.w3c.dom.Element element=document.getDocumentElement();//获得稳定的元素节点
		NodeList bookNodes=element.getElementsByTagName("book");//从这个节点开始遍历
		for(int i=0;i<bookNodes.getLength();i++){
			org.w3c.dom.Element bookElement=(org.w3c.dom.Element)bookNodes.item(i);
			Book book=new Book();
			book.setId(Integer.parseInt(bookElement.getAttribute("id")));
			NodeList childNodes=bookElement.getChildNodes();
			for(int j=0;j<childNodes.getLength();j++){
				if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE){
					if("name".equals(childNodes.item(j).getNodeName())){
						book.setName(childNodes.item(j).getFirstChild().getNodeValue());
					}else if("price".equals(childNodes.item(j).getNodeName())){
						book.setPrice(Float.parseFloat(childNodes.item(j).getFirstChild().getNodeValue()));
					}
				}
			}
			list.add(book);
		}		
		return list;
	}
	
}

Test.java文件:

public class Test {

	public Test() {
		// TODO Auto-generated constructor stub
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String path="http://pc-20150724xmdx:8080/myhttp/book.xml";//这是这个电脑web项目通用的网址(不用考虑ip地址)
		InputStream inputStream=HttpUtils.getXML(path);//让客户端来访问服务器端
		DomService service=new DomService();
		try {
			List<Book> list=service.getBooks(inputStream);
			for (Book book : list) {
				System.out.println(book.toString());
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

book.xml文件:

<books>
      <book id="12">
           <name>thinking in java</name>
            <price>85.5</price>
      </book>
      <book id="15">
           <name>Spring in Action</name>
            <price>39.0</price>
      </book>
</books>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值