使用XmlPullParser对xml进行读取

XML文件是一种标记性语言;在开发中经常在接口交互时被用作报文传输或者把自定义的类序列化为XML的形式存储到数据库。正因为XML文件这么常用,使用JAVA对XML文件进行读写操作是每一个开发人员必须掌握的技能点,下面总结一下个人用JAVA对XML文件的读写操作。

JAVA在XML解释器方面的包比较多,有基于DOM解释的DOM4j、推模式的SAX及拉模式的STAX。粗略介绍下这几种方式的特点,具体理论知识最好网上搜索一下进行了解。

* 1) 解释DOM : 每次都会把xml的具体内容加载到内存,操作速度比较快,不利于操作大的xml (J2EE常用)
     * 2) 推模式SAX : 解释能够比较快完成xml解析,占用内存比较小.但可控性相对不灵活
     * 3) 拉模式STAX : 可控性比较高,操作灵活.(Andriod内置XMLPullParser)

  因此个人查找了一下基于STAX模式的XmlPullParser进行学习,后面也会总结几篇对XmlPullParser的使用说明。首先先来使用XmlPullParser对Xml进行读取操作

  说明: XmlPullParser(后面简写为xpp)为第三方开源的内容,使用时需要引入第三方的包  xpp3-1.1.4.C.jar

下载地址为: http://www.extreme.indiana.edu/dist/java-repository/xpp3/distributions/xpp3-1.1.4c_all.zip

代码功能说明:使用xpp对xml文件进行遍历,包括空的Text节点,及属性等内容

被读取的XML文件如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <bookshops>
 3     <bookshop No="1">
 4         <isenterty>no</isenterty>
 5         <name>dangdang</name>
 6         <address>http://www.dangdang.com</address>
 7         <ip/>
 8     </bookshop>
 9     <bookshop No="2">
10         <isenterty>yes</isenterty>
11         <name>dangdang</name>
12         <address>广州市中山三路</address>
13     </bookshop>
14     <bookshop No="3">
15         <isenterty>no</isenterty>
16         <name>amazon</name>
17         <address>http//www.amazon.com</address>
18     </bookshop>
19     <bookshop No="4">
20         <isenterty>no</isenterty>
21         <name>jingdong</name>
22         <address>http://www.jingdong.com</address>
23     </bookshop>
24     <bookshop No="5">
25         <name>taobao</name>
26         <address>http://www.taobao.com</address>
27         <isenterty>no</isenterty>
28     </bookshop>
29 </bookshops>

使用JAVA读取操作如下:

由于xpp上面的chm文件对应的API查找字段常量时比较麻烦,因此附上xpp定义节点常量字段说明


XmlPullParser 节点字段对应表格


类型


字段名称



public static final int


CDSECT


5


public static final int


COMMENT


9


public static final int


END_DOCUMENT


1


public static final int


START_DOCUMENT


0


public static final int


END_TAG


3


public static final int


START_TAG


2


public static final int


TEXT


4

  1 package com.scl.j2se.xmlread.xxp;
  2
  3 import java.io.FileInputStream;
  4
  5 import org.xmlpull.v1.XmlPullParser;
  6 import org.xmlpull.v1.XmlPullParserFactory;
  7 /************************************************************************
  8  * 版 本 号 :  v1.0.0.0
  9  * 作      者  :  suncl
 10  * 创建时间 :  2015年9月5日
 11  * 更新时间 :  2015年9月5日
 12  * 项目名称 :  XPPTest.java
 13  * 说       明 :  基于STAX的XML遍历方式
 14  * 总       结 :
 15  *           1. 使用拉模式比解析dom和推模式的优点
 16  *             1) 解释DOM,每次都会把xml的具体内容加载到内存,操作速度比较快,不利于操作大的xml (J2EE常用)
 17  *             2) 推模式SAX解释能够比较快完成xml解析,占用内存比较小.但可控性相对不灵活
 18  *             3) 拉模式STAX可控性比较高,操作灵活.(Andriod内置XMLPullParser)
 19  *           2. 使用XmlPullParser的步骤如下
 20  *          1) 创建解析器工厂,通过工厂对象获取单个解析器 [跟Dom4j一样]
 21  *          2) 通过setInput方法把解释文件通过流的形式传递给解释器,尽可能添加编码方式
 22  *          3) 通过XmlPullParser的next方法对XMl进行循环读取
 23  *        3. 使用  nextText()方法可能会导致抛异常,尽可能知道名称的情况下再使用该方法
 24  ************************************************************************
 25  * Copyright @   suncl 2013 . All rights reserved.
 26  ************************************************************************/
 27
 28 public class XPPTest
 29 {
 30     //常量字符串
 31     final static String STR_NODE_START_TAG = "<";
 32     final static String STR_NODE_END = ">";
 33     final static String STR_NODE_END_TAG_WITHVALUE_END = "</";
 34
 35     //final static String STR_NODE_END_TAG_WITHOUTVALUE_END = "/>";
 36
 37     public static void main(String[] args) throws Exception
 38     {
 39         //通过工厂模式获取xml解析器对象
 40         XmlPullParserFactory xmlFactory = XmlPullParserFactory.newInstance();
 41         XmlPullParser xmlParser = xmlFactory.newPullParser();
 42         //把解释文件流及编码格式交给解释器
 43         xmlParser.setInput(new FileInputStream("MyXml.xml"), "UTF-8");
 44         int eventType = xmlParser.getEventType();
 45         //使用XmlPullParser遍历xml
 46         while ((eventType = xmlParser.getEventType()) != XmlPullParser.END_DOCUMENT)
 47         {
 48             //根据节点类型输出参数
 49             if (eventType == XmlPullParser.START_TAG)
 50             {
 51                 System.out.print(STR_NODE_START_TAG + xmlParser.getName());
 52                 //获取节点下的属性
 53                 int attrCount = xmlParser.getAttributeCount();
 54                 for (int i = 0; i < attrCount; i++)
 55                 {
 56                     String attrName = xmlParser.getAttributeName(i);
 57                     String attrValue = xmlParser.getAttributeValue(i);
 58                     System.out.print(" " + attrName + "=\"" + attrValue + "\"");
 59                 }
 60                 System.out.print(STR_NODE_END);
 61             }
 62             else if (eventType == XmlPullParser.TEXT)
 63             {
 64                 //                //判断文本是否为空
 65                 //                if (xmlParser.isWhitespace())
 66                 //                {
 67                 //                    System.out.println(true);
 68                 //                }
 69                 System.out.print(xmlParser.getText());
 70             }
 71             else if (eventType == XmlPullParser.END_TAG)
 72             {
 73                 System.out.print(STR_NODE_END_TAG_WITHVALUE_END + xmlParser.getName() + STR_NODE_END);
 74             }
 75
 76             //XmlPullParser在底层实现了Iterator接口可通过next方法获取下一个xml节点
 77             xmlParser.next();
 78
 79             //测试单节点的情况下是否会进入做开始和结束判断如<ip/>,所以只做一次结束符判断即可
 80             //            if( eventType == XmlPullParser.START_TAG && xmlParser.getName().equals("ip"))
 81             //            {
 82             //                System.out.println("判断ip的开始元素开始执行");
 83             //            }
 84             //            else if (eventType == XmlPullParser.END_TAG && xmlParser.getName().equals("ip"))
 85             //            {
 86             //                System.out.println("判断ip的结束标签开始执行");
 87             //            }
 88             //            xmlParser.next();
 89
 90             //nextText()函数可能会导致出错,如<bookShops><bookShop><id></id></bookShop></bookShops>
 91             //抛异常:
 92             //            if ((eventType == XmlPullParser.START_TAG) && (xmlParser.getName().equals("bookshop")))
 93             //            {
 94             //                System.out.println(xmlParser.nextText());
 95             //            }
 96             //            xmlParser.next();
 97         }
 98
 99     }
100 }

以上为使用XmlPullParse 实现STAX模式的XML文件读取。

时间: 2024-12-11 11:37:33

使用XmlPullParser对xml进行读取的相关文章

Android开发学习---使用XmlPullParser解析xml文件

Android中解析XML的方式主要有三种:sax,dom和pull关于其内容可参考:http://blog.csdn.net/liuhe688/article/details/6415593 本文将主要介绍pull解析器解析xml文件,环境为ubuntu 12.04+ intelij 13.1 + android sdk 2.1 一.创建一个XML项目,步骤如下: 二.解析一个xml文件: assets/person.xml <?xml version="1.0" encodi

游戏场景需要是可配置的:AssetManager工具类和xml文件读取

我们已经知道,游戏得有个活动场景(每个场景是个可点击的button控件),并且可以通过代码生成控件的方式把活动场景进行多行多列的排列.见上篇:https://www.cnblogs.com/zzqm-gamelife/p/10254466.html 但是没有解决这样的问题: 1.场景名称需要自定义 2.版本更新,今天要加个"蟠桃园"的地图,明天活动,又加个"九重妖塔". 如果每次加个地图就要改一次代码,太麻烦了.我们选择用xml文件来做配置(PS,有条件的可以用服务

XmlPullParser 解析xml文件

1 public static List<Person> getPersons(InputStream xml) throws Exception{ 2 List<Person> persons = null; 3 Person person = null; 4 XmlPullParser pullParser = Xml.newPullParser(); 5 pullParser.setInput(xml, "UTF-8");//为Pull解析器设置要解析的X

php xml 文件读取 XMLReader

php xml 文件读取 <?php /** $xmlString = '<xml> <persons count="10"> <person username="username1" age="20">this is username1 description</person> <person username="username2" age="20&qu

利用反射与dom4j读取javabean生成对应XML和读取XML得到对应的javabean对象集合

转自:http://blog.csdn.net/zhao19861029/article/details/8473245 首先实现生成对应的JAVAbean的XML文件方法 /** * DMO4J写入XML * @param obj 泛型对象 * @param entityPropertys 泛型对象的List集合 * @param Encode XML自定义编码类型(推荐使用GBK) * @param XMLPathAndName XML文件的路径及文件名 */ public void wri

php操作XML,读取数据和写入数据的方法

xml文件 <?xml version="1.0" encoding="utf-8"?> <vip> <id>23</id> <username>开心的路飞</username> <sex>男</sex> <face>face/43.jpg</face> <email>[email protected]</email> &l

javascript读取xml文件读取节点数据的例子

分享下用javascript读取xml文件读取节点数据方法. 读取的节点数据,还有一种情况是读取节点属性数据. <head> <title></title> <script type="text/javascript"> var objLength = null; var xmlHttp; var strurl = ""; function ajaxrequst() { if (window.ActiveXObject

unity xml的读取和写入和创建

unity xml的读取和写入 Xml是一种常用的数据格式,方便数据的索引查找 1.首先引入相关的动态链接库: 1.1System.Data.dll 1.2Excel.DLL 1.3文件应用抬头 using UnityEngine; using System.Collections; using System.IO; using System.Xml; using System.Data; using System.Collections.Generic; using System.Linq;

php xml创建读取

<?php /* Copyright (c) 2011 Sandeep.C.R, <[email protected]> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software with