Android中XML解析-Dom解析
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; } } |
周末看博客的都是好孩子,祝大家周末愉快~
作者:FlyElephant
出处:http://www.cnblogs.com/xiaofeixiang
说明:博客经个人辛苦努力所得,如有转载会特别申明,博客不求技惊四座,但求与有缘人分享个人学习知识,生活学习提高之用,博客所有权归本人和博客园所有,如有转载请在显著位置给出博文链接和作者姓名,否则本人将付诸法律。
出处:http://www.cnblogs.com/xiaofeixiang
说明:博客经个人辛苦努力所得,如有转载会特别申明,博客不求技惊四座,但求与有缘人分享个人学习知识,生活学习提高之用,博客所有权归本人和博客园所有,如有转载请在显著位置给出博文链接和作者姓名,否则本人将付诸法律。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述