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文件如下:

 <?xml version="1.0" encoding="UTF-8"?>
<bookshops>
<bookshop No="1">
<isenterty>no</isenterty>
<name>dangdang</name>
<address>http://www.dangdang.com</address>
<ip/>
</bookshop>
<bookshop No="2">
<isenterty>yes</isenterty>
<name>dangdang</name>
<address>广州市中山三路</address>
</bookshop>
<bookshop No="3">
<isenterty>no</isenterty>
<name>amazon</name>
<address>http//www.amazon.com</address>
</bookshop>
<bookshop No="4">
<isenterty>no</isenterty>
<name>jingdong</name>
<address>http://www.jingdong.com</address>
</bookshop>
<bookshop No="5">
<name>taobao</name>
<address>http://www.taobao.com</address>
<isenterty>no</isenterty>
</bookshop>
</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

 package com.scl.j2se.xmlread.xxp;

 import java.io.FileInputStream;

 import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
/************************************************************************
* 版 本 号 : v1.0.0.0
* 作 者 : suncl
* 创建时间 : 2015年9月5日
* 更新时间 : 2015年9月5日
* 项目名称 : XPPTest.java
* 说 明 : 基于STAX的XML遍历方式
* 总 结 :
* 1. 使用拉模式比解析dom和推模式的优点
* 1) 解释DOM,每次都会把xml的具体内容加载到内存,操作速度比较快,不利于操作大的xml (J2EE常用)
* 2) 推模式SAX解释能够比较快完成xml解析,占用内存比较小.但可控性相对不灵活
* 3) 拉模式STAX可控性比较高,操作灵活.(Andriod内置XMLPullParser)
* 2. 使用XmlPullParser的步骤如下
* 1) 创建解析器工厂,通过工厂对象获取单个解析器 [跟Dom4j一样]
* 2) 通过setInput方法把解释文件通过流的形式传递给解释器,尽可能添加编码方式
* 3) 通过XmlPullParser的next方法对XMl进行循环读取
* 3. 使用 nextText()方法可能会导致抛异常,尽可能知道名称的情况下再使用该方法
************************************************************************
* Copyright @ suncl 2013 . All rights reserved.
************************************************************************/ public class XPPTest
{
//常量字符串
final static String STR_NODE_START_TAG = "<";
final static String STR_NODE_END = ">";
final static String STR_NODE_END_TAG_WITHVALUE_END = "</"; //final static String STR_NODE_END_TAG_WITHOUTVALUE_END = "/>"; public static void main(String[] args) throws Exception
{
//通过工厂模式获取xml解析器对象
XmlPullParserFactory xmlFactory = XmlPullParserFactory.newInstance();
XmlPullParser xmlParser = xmlFactory.newPullParser();
//把解释文件流及编码格式交给解释器
xmlParser.setInput(new FileInputStream("MyXml.xml"), "UTF-8");
int eventType = xmlParser.getEventType();
//使用XmlPullParser遍历xml
while ((eventType = xmlParser.getEventType()) != XmlPullParser.END_DOCUMENT)
{
//根据节点类型输出参数
if (eventType == XmlPullParser.START_TAG)
{
System.out.print(STR_NODE_START_TAG + xmlParser.getName());
//获取节点下的属性
int attrCount = xmlParser.getAttributeCount();
for (int i = 0; i < attrCount; i++)
{
String attrName = xmlParser.getAttributeName(i);
String attrValue = xmlParser.getAttributeValue(i);
System.out.print(" " + attrName + "=\"" + attrValue + "\"");
}
System.out.print(STR_NODE_END);
}
else if (eventType == XmlPullParser.TEXT)
{
// //判断文本是否为空
// if (xmlParser.isWhitespace())
// {
// System.out.println(true);
// }
System.out.print(xmlParser.getText());
}
else if (eventType == XmlPullParser.END_TAG)
{
System.out.print(STR_NODE_END_TAG_WITHVALUE_END + xmlParser.getName() + STR_NODE_END);
} //XmlPullParser在底层实现了Iterator接口可通过next方法获取下一个xml节点
xmlParser.next(); //测试单节点的情况下是否会进入做开始和结束判断如<ip/>,所以只做一次结束符判断即可
// if( eventType == XmlPullParser.START_TAG && xmlParser.getName().equals("ip"))
// {
// System.out.println("判断ip的开始元素开始执行");
// }
// else if (eventType == XmlPullParser.END_TAG && xmlParser.getName().equals("ip"))
// {
// System.out.println("判断ip的结束标签开始执行");
// }
// xmlParser.next(); //nextText()函数可能会导致出错,如<bookShops><bookShop><id></id></bookShop></bookShops>
//抛异常:
// if ((eventType == XmlPullParser.START_TAG) && (xmlParser.getName().equals("bookshop")))
// {
// System.out.println(xmlParser.nextText());
// }
// xmlParser.next();
} }
}

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

补充: (1)XmlPullParse 解释器有一个不太好的地方,就是如果xml的格式类似:

<?xml version="1.0" encoding="UTF-8"?>
<book>
<id>1</id>
<name>流浪记</name>
</book>
<book>
<id>2</id>
<name>变形记</name>
</book>

  解释的时候,解释器会报错。以book作为一个根节点,不能在以book结束节点后面再添加一个相同的开始节点。必须添加一个另外名称的根节点才可以避开这种问题.

  

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

  1. Android 使用XmlPullParser解析xml

    这里我们假设要解析的xml文件名为:test.xml,我们将其放在assets路径中. xml文件内容为: <?xml version='1.0' encoding='utf-8' standa ...

  2. php xml 文件读取 XMLReader

    php xml 文件读取 <?php /** $xmlString = '<xml> <persons count="10"> <person ...

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

    转自:http://blog.csdn.net/zhao19861029/article/details/8473245 首先实现生成对应的JAVAbean的XML文件方法 /** * DMO4J写入 ...

  4. Webwork 学习之路【05】请求跳转前 xwork.xml 的读取

    个人理解 WebWork 与 Struts2 都是将xml配置文件作为 Controler 跳转的基本依据,WebWork 跳转 Action 前 xml 文件的读取依赖 xwork-1.0.jar, ...

  5. XML数据读取方式性能比较(一)

    原文:XML数据读取方式性能比较(一) 几个月来,疑被SOA,一直在和XML操作打交道,SQL差不多又忘光了.现在已经知道,至少有四种常用人XML数据操作方式(好像Java差不多),不过还没有实际比较 ...

  6. 使用OPEN XML SDK 读取EXCEL中的超链接Hyperlink

    使用OPEN XML SDK 读取EXCEL中的超链接Hyperlink 原理 先创建一个包括全部EXCEL单元格中超链接Hyperlink数据的表,再定位单元格通过列头(如A1,B1)获取超链接信息 ...

  7. Java 操纵XML之读取XML文件

    Java 操纵XML之读取XML文件 一.JAVA DOM PARSER DOM interfaces The DOM defines several Java interfaces. Here ar ...

  8. Webwork【05】请求跳转前 xwork.xml 的读取

    个人理解 WebWork 与 Struts2 都是将xml配置文件作为 Controler 跳转的基本依据,WebWork 跳转 Action 前 xml 文件的读取依赖 xwork-1.0.jar, ...

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

    分享下用javascript读取xml文件读取节点数据方法. 读取的节点数据,还有一种情况是读取节点属性数据. <head> <title></title> < ...

随机推荐

  1. 【推荐】对 Linux 用户非常有用的 60 个命令(由浅入深)

    对 Linux 新手非常有用的 20 个命令 http://www.oschina.net/translate/useful-linux-commands-for-newbies 对 Linux 中级 ...

  2. DotNet IOC Framework - Microsoft Unity介绍

    一. 新建一个ASP.NET MVC4项目 二. 安装Microsoft Unity 1) 管理Nuget程序包 2)安装Unity3程序包 在你的App_Start文件夹里会多出来两个文件 三. 一 ...

  3. XMLHTTP使用具体解释

    XMLHTTP对象是Microsoft的MSXML开发包中带的一个用HTTP,XML协议訪问web资源的对象. 从MSXML3.0開始出现. 它在AJAX技术中主要用来从其它网络资源获取信息,然后由j ...

  4. 【设计模式】学习笔记17:代理模式之保护代理与Java反射

    本文出自   http://blog.csdn.net/shuangde800 本笔记内容: 1. Java动态代理,反射机制 2. 保护代理 3. 应用保护代理实现的约会系统 ----------- ...

  5. json处理复杂对象jsonConfig

     我们通常的Json字符串和java当对象互转.经常有选择性地过滤掉一些属性值,和json-lib包JsonConfig为我们提供了这样一个 特征,有几种方法实施细则. (1)建立JsonConf ...

  6. 《RESTful Web Services》第一章 使用统一接口

    序言 HTTP是一种应用层协议.SOAP和一些Ajax Web框架都将HTTP作为一种传输信息的协议,难以充分利用HTTP层的基础设施. 1.2 如何保持交互的可见性     可见性是HTTP的一个核 ...

  7. 用linq实现登陆功能

    BLL层的逻辑代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; name ...

  8. 配置SQL Server 2008管理器

    SQl Server 配置管理器(简称为配置管理器)包含了SQL Server 2008服务.SQL Server 2008网络配置和SQL Native Client配置3个工具,供数据库管理人员做 ...

  9. vb.net写的odbc连接dsn数据源和ole链接oracle的小例子

    最近由于工作需要开始接触vb2010,也叫vb.net.相比vb6.0有面向对象编程的优势.同时接触一门新语言,要更快的实际应用起来,链接数据库是必不可少的.之前用vba写过一个售书工具,正好可以拿来 ...

  10. UIPickerView

    1.UIPickView什么时候用? 通常在注册模块,当用户需要选择一些东西的时候,比如说城市,往往弹出一个PickerView给他们选择. UIPickView常见用法,演示实例程序 1> 独 ...