Android中XML解析-Dom解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

Android中需要解析服务器端传过来的数据,由于XML是与平台无关的特性,被广泛运用于数据通信中,有的时候需要解析xml数据,格式有三种方式,分别是DOM、SAX以及PULL三种方式,本文就简单以Dom解析为例,解析XML, DOM方式解析xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据的,但是这样一来,如果xml文件很大,手机CPU处理能力比PC差,因此在处理效率方面就相对差了,使用Dom解析就不是太合适了。

基础维护

首先下assets目录下新建一个Book.xml文件:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?xml version= "1.0"  encoding= "utf-8" ?>
<Books>
 
     <Book name= "康师傅的亿万帝国"  >
 
         <Title>
     据周元根的小学同学回忆,大约 7 岁那年,周元根开始读小学,由于和别人重名,于是改了名字。但他在村里一直沿用“周元根”这个名字,周家祖坟的 5 块墓碑上,刻的也是“周元根”这个名字。
         
         </Title>
 
         <Picture>
      http: //p.qpic.cn/ninja/0/ninja1406636943/0
         
         </Picture>
     </Book>
 
     <Book name= "徐才厚受贿额特别巨大"  >
 
         <Title>
    根据最高人民检察院授权,军事检察院对中央军委原副主席徐才厚以涉嫌受贿犯罪立案侦查。 2014 10 27 日,对该案侦查终结,移送审查起诉。
 
         </Title>
 
         <Picture>
http: //www.sinaimg.cn/dy/slidenews/1_img/2014_44/2841_506865_709392.jpg
         
         </Picture>
     </Book>
     <Book name= "发改委副司长魏鹏远"  >
 
         <Title>
     最高人民检察院反贪污贿赂总局局长徐进辉今日表示,煤炭司副司长魏鹏远家中搜查发现现金折合人民币 2 亿余元,成为建国以来检察机关一次起获赃款现金数额最大的案件。
 
         </Title>
 
         <Picture>
     http: //img1.cache.netease.com/catchpic/D/DC/DCB2315FD0F50C665BB1474768192642.jpg
 
         </Picture>
     </Book>
 
</Books>

 

XML存储的方式其实和类存储的是类似的,这个时候建一个对应的Book类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public  class  Book {
     private  String title;
     private  String picture;
     private  String name;
     public  String getName() {
         return  name;
     }
     public  void  setName(String name) {
         this .name = name;
     }
     public  String getTitle() {
         return  title;
     }
     public  void  setTitle(String title) {
         this .title = title;
     }
     public  String getPicture() {
         return  picture;
     }
     public  void  setPicture(String picture) {
         this .picture = picture;
     }
}

 Book布局文件:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?xml version= "1.0"  encoding= "utf-8" ?>
<LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
     android:layout_width= "match_parent"
     android:layout_height= "wrap_content"
     android:orientation= "horizontal"  >
 
     <ImageView
         android:id= "@+id/itemImage"
         android:layout_width= "40dp"
         android:layout_height= "60dp"
         android:src= "@drawable/fight"
        />
 
     <LinearLayout
         android:layout_width= "match_parent"
         android:layout_height= "wrap_content"
         android:orientation= "vertical"
         android:paddingLeft= "10dp"
        >
 
         <TextView
             android:id= "@+id/itemTitle"
             android:layout_width= "match_parent"
             android:layout_height= "wrap_content"
             android:text= "标题"
             android:textSize= "18sp"  />
 
         <TextView
             android:id= "@+id/itemText"
             android:layout_width= "match_parent"
             android:layout_height= "wrap_content"
             android:textSize= "12sp"
             android:text= "xxxxxxxxx"  />
     </LinearLayout>
 
</LinearLayout>

 

Demo实现

 

现在最主要的是将XML的Book转换成一个Book集合:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public  List<Book> getBooks(InputStream stream) {
     List<Book> list =  new  ArrayList<Book>();
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     try  {
         DocumentBuilder builder = factory.newDocumentBuilder();
         // 获取XML文档结构
         Document document = builder.parse(stream);
         // 获取根节点
         Element rootElement = document.getDocumentElement();
         NodeList nodeList = rootElement.getElementsByTagName( "Book" );
         for  ( int  i =  0 ; i < nodeList.getLength(); i++) {
             Book book =  new  Book();
             // Node转成Element
             Element element = (Element) nodeList.item(i);
             book.setName(element.getAttribute( "name" ));
             Element eleTitlElement = (Element) element
                     .getElementsByTagName( "Title" ).item( 0 );
             String title = eleTitlElement.getFirstChild().getNodeValue();
             Element elePicElement = (Element) element.getElementsByTagName(
                     "Picture" ).item( 0 );
             String picString = elePicElement.getFirstChild().getNodeValue();
             book.setTitle(title);
             book.setPicture(picString);
             list.add(book);
         }
     catch  (ParserConfigurationException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
     catch  (SAXException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
     catch  (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
     }
     return  list;
 
}

 1.通过DocumentBuilderFactory工厂类实例化一个工厂,通过工厂的newDocumentBuilder()方法实例化一个DocumentBuilder .通过创建好的 DocumentBuilder 对象的 parse(InputStream) 方法就可以解析我们的xml文档,然后返回的是一个Document的对象,这个Document对象代表的就是我们的整个xml文档。

2.获取整个xml的Document对象后,我们可以获得其下面的各个元素节点(Element),同样每个元素节点可能又有多个属性(Attribute),根据每个元素节点我们又可以遍历该元素节点下面的子节点等等。

MainActivity启动方法中的调用:

 

1
2
3
4
5
6
7
8
9
10
11
12
InputStream inputStream =  null ;
try  {
     inputStream = inputStream = MainActivity. this .getResources().getAssets().open( "Book.xml" );
catch  (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
}
 
list = getBooks(inputStream);
View view = getLayoutInflater().inflate(R.layout.activity_main,  null );
ListView listView = (ListView) findViewById(R.id.list_dom);
listView.setAdapter( new  testAdapter());

 

testAdapter的写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class  testAdapter  extends  BaseAdapter {
 
     @Override
     public  int  getCount() {
         // TODO Auto-generated method stub
         return  list.size();
     }
 
     @Override
     public  Object getItem( int  position) {
         // TODO Auto-generated method stub
         return  null ;
     }
 
     @Override
     public  long  getItemId( int  position) {
         // TODO Auto-generated method stub
         return  0 ;
     }
 
     @Override
     public  View getView( int  position, View convertView, ViewGroup parent) {
         Book book = (Book) list.get(position);
         View view =  null ;
         if  (convertView ==  null ) {
             LayoutInflater layoutInflater = getLayoutInflater();
             view = layoutInflater.inflate(R.layout.book,  null );
         else  {
             view = convertView;
         }
         // ImageView imageView = (ImageView)
         // view.findViewById(R.id.itemImage);
 
         // imageView.setImageResource(BIND_ABOVE_CLIENT);
         TextView titleView = (TextView) view.findViewById(R.id.itemTitle);
         titleView.setText(book.getName());
 
         TextView contentView = (TextView) view.findViewById(R.id.itemText);
         contentView.setText(book.getTitle());
         return  view;
     }
 
}

 本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4066444.html,如需转载请自行联系原作者

相关文章
|
2月前
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
|
1月前
|
Java 开发工具 Android开发
Android与iOS开发环境搭建全解析####
本文深入探讨了Android与iOS两大移动操作系统的开发环境搭建流程,旨在为初学者及有一定基础的开发者提供详尽指南。我们将从开发工具的选择、环境配置到第一个简单应用的创建,一步步引导读者步入移动应用开发的殿堂。无论你是Android Studio的新手还是Xcode的探索者,本文都将为你扫清开发道路上的障碍,助你快速上手并享受跨平台移动开发的乐趣。 ####
|
25天前
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。
|
1月前
|
安全 Java Linux
深入解析Android系统架构及其对开发者的意义####
【10月更文挑战第21天】 本文旨在为读者揭开Android操作系统架构的神秘面纱,探讨其如何塑造现代移动应用开发格局。通过剖析Linux内核、硬件抽象层、运行时环境及应用程序框架等关键组件,揭示Android平台的强大功能与灵活性。文章强调了理解Android架构对于开发者优化应用性能、提升用户体验的重要性,并展望了未来技术趋势下Android的发展方向。 ####
47 0
|
2月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
2月前
|
JavaScript 前端开发 算法
React 虚拟 DOM 深度解析
【10月更文挑战第5天】本文深入解析了 React 虚拟 DOM 的工作原理,包括其基础概念、优点与缺点,以及 Diff 算法的关键点。同时,分享了常见问题及解决方法,并介绍了作者在代码/项目上的成就和经验,如大型电商平台的前端重构和开源贡献。
67 3
|
2月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
2月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
2月前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
88 0
|
21天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
42 19

热门文章

最新文章

推荐镜像

更多