XML:  可扩展标记语言(extensible Markup Language)

  用于标记电子文件使其具有结构性的标记语言。XML可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

xml语言示例:

<?xml version ="1.0" encoding="utf-8" ?>     =》》这个必须要有
<persons>
  <person id="01">
    <name>李鹏</name>
    <age>22</age>
    <sex>男</sex>
  </person>
  <person id="02">
    <name>李四</name>
    <age>23</age>
    <sex>女</sex>
  </person>
</persons>

xml的解析方法:

1:SAX解析

  MyHandler类,负责解析xml文档将查找的值使用面向对象思想放在对象列表中==》必须要继承DefaultHandler类

package sax;

import java.util.ArrayList;
import java.util.List; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; public class MyHandler extends DefaultHandler
{
private List<Person> list;
private Person person;
private String tagName;//存储开始标签名字
//解析到文档开头时,执行该方法
@Override
public void startDocument() throws SAXException
{
list = new ArrayList<Person>();
} //解析到开始标签时,执行该方法,qName参数用来接收标签名字
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException
{
tagName = qName;
if("person".equals(qName))
{
person = new Person();
if(attributes !=null)
{
//解析标签中的内容 如:<person id="01"> 中的id
for(int i =0;i<attributes.getLength();i++)
{
String name = attributes.getQName(i);
String value = attributes.getValue(i);
if("id".equals(name))
{
person.setId(Integer.parseInt(value));
}
}
}
} }
//解析到标签内容时,执行该方法,解析到的标签内容传给了参数ch
@Override
public void characters(char[] ch, int start, int length)
throws SAXException
{
String str = new String(ch,start,length);
if("name".equals(tagName))
person.setName(str);
else if("age".equals(tagName))
person.setAge(Integer.parseInt(str));
else if("sex".equals(tagName))
person.setSex(str); }
//解析到结束标签时,执行该方法,qName接收标签名称
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException
{
tagName = null;//这里必须置空
if("person".equals(qName))
{
list.add(person);
} }
//解析到文档结束时,执行该方法
@Override
public void endDocument() throws SAXException
{ }
public List<Person> getList()
{
return list;
} }

Test类:负责建立解析器,建立解析器使用的读取类和读取流,读取到数据并显示在客户端,其中的HttpUtil类在上篇博客中有

package sax;

import java.io.IOException;
import java.io.InputStream;
import java.util.List; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; public class Test
{ public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException
{
//创建Sax解析工厂对象
SAXParserFactory factory = SAXParserFactory.newInstance();
//创建Sax解析器对象---具备解析功能的对象
SAXParser parser = factory.newSAXParser(); String path = "http://localhost:9999/day16/user2.xml";
//创建被解析的文件的读取流
InputStream in = HttpUtil.getInputStram(path);
//创建MyHandler对象
MyHandler handler = new MyHandler();
//解析器使用文件字节读取流读取文件,读取的过程中调用handler中的方法
parser.parse(in,handler);
//获取集合
List<Person> list = handler.getList(); for(Person per:list)
{
System.out.println(per);
}
} }

2:PULL解析 ==》直接返回解析得到的list列表

package PULL;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory; public class Pull
{
public static List<Person> pullParser(InputStream in)
throws XmlPullParserException, NumberFormatException, IOException
{
List<Person> list = null;
Person person = null;
//创建pull解析工厂类对象
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//创建pull解析器对象
XmlPullParser parser = factory.newPullParser();
//创建被解析文件的读取流对象
InputStream input = in;
parser.setInput(input,"utf-8");
//把被解析的文件的读取流给解析器
//得到解析器返回的第一个编号
int event = parser.getEventType();
while (event != XmlPullParser.END_DOCUMENT)
{
switch (event)
{
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:
//得到解析到的标签名
String tagName = parser.getName();
if ("person".equals(tagName))
{
person = new Person();
int count = parser.getAttributeCount();
for (int i = 0; i < count; i++)
{
//直接得到开始标签后边的数据
String attrName = parser.getAttributeName(i);
String attrValue = parser.getAttributeValue(i);
if ("id".equals(attrName))
person.setId(Integer.parseInt(attrValue));
}
} else if ("age".equals(tagName))
person.setAge(Integer.parseInt(parser.nextText()));
else if ("sex".equals(tagName))
person.setSex(parser.nextText());
else if("name".equals(tagName))
person.setName(parser.nextText());
break;
case XmlPullParser.END_TAG:
if ("person".equals(parser.getName()))
list.add(person);
break;
}
//得到下一个编号
event = parser.next();
}
return list; } }

JAVA 中XML的解析的更多相关文章

  1. 转:在java中使用dom4j解析xml

    JAVA 使用Dom4j 解析XML Java DOM4J Parser - Parse XML Document Dom4j下载及使用Dom4j读写XML简介 在java中使用dom4j解析xml ...

  2. Java中XML格式的字符串4读取方式的简单比较

    Java中XML格式的字符串4读取方式的简单比较 1.java自带的DOM解析. import java.io.StringReader; import javax.xml.parsers.Docum ...

  3. 第70节:Java中xml和tomcat

    第70节:Java中xml和tomcat 前言: 哭着也要看完,字数: jdbc crud - statement dao java.sql.Driver The interface that eve ...

  4. Java中XML数据

    Java中XML数据 XML解析——Java中XML的四种解析方式 XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解 ...

  5. JAVA中生成、解析二维码图片的方法

    JAVA中生成.解析二维码的方法并不复杂,使用google的zxing包就可以实现.下面的方法包含了生成二维码.在中间附加logo.添加文字功能,并有解析二维码的方法. 一.下载zxing的架包,并导 ...

  6. 沉淀再出发:java中线程池解析

    沉淀再出发:java中线程池解析 一.前言 在多线程执行的环境之中,如果线程执行的时间短但是启动的线程又非常多,线程运转的时间基本上浪费在了创建和销毁上面,因此有没有一种方式能够让一个线程执行完自己的 ...

  7. java中采用dom4j解析xml文件

    一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4 ...

  8. XML解析——Java中XML的四种解析方式

    XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四 ...

  9. XML解析——Java中XML的四种解析方式(转载 by 龍清扬)

    XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四 ...

随机推荐

  1. LeetCode记录(1)——Array

    1.Two Sum naive 4.Median of Two Sorted Arrays 找两个已排序数组的中位数 直接数可以过,但很蠢,O(m+n)时间 class Solution { publ ...

  2. WordPress基础:自定义菜单

    需要自定义一个菜单,可以访问后台->外观->菜单

  3. http之Session&Cookie

    百度了一波session与Cookie,我发现这东西远比我想象中更复杂(可能是因为我不明白底层的运行原理).网上也是一堆的关于Session与Cookie区别/联系的文章,然而,我看完了还是一脸懵逼的 ...

  4. Cen0S下挂载设备

    在CentOS中,如果我们要查看光驱,U盘或者要把安装包挂载到某个文件夹,我写下我的一些理解. 所谓的挂载,就是把物理设备或者文件(包含安装文件,压缩包等等),与系统中的某个目录建立一个快捷方式,然后 ...

  5. Web自动化测试工具调研

    背景 Web自动化测试越来越被重视, 因为现在Web已经是工程化的状态. 如何通过工具测试, 保证Web开发的质量,提升开发效率,是Web工具的诞生的来由. Web测试分为以下几个方面: 1. 界面测 ...

  6. XSLT简介

    什么是? http://www.w3school.com.cn/xsl/xsl_intro.asp XSLT 是一种用于将 XML 文档转换为 XHTML 文档或其他 XML 文档的语言. XPath ...

  7. axis2打包方式发布

    参照http://gao-xianglong.iteye.com/blog/1744557这篇文章,注意的是打包services.xml的时候要将它的上级目录meta-inf一起打包,放到axis2\ ...

  8. python基础:交互式解释器

    什么是"交互式python解释器"? 当你看到">>>"符号,就意味着你进入交互式python解释器,又称作"提示符". ...

  9. JOIN,WHERE判断和ORDERBY排序

    MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小. 如果重复代码只是 ...

  10. 使用hbuilder编辑器实现移动app打包

    作为一枚web前端来讲,需要了解的东西太多,需要学习的也太多了,那天因为公司需求,就研究了下移动网站打包成app的方法,这种东西好像是H5出来后就有推出的,因为性功能不行,就没怎么关注,但现在移动互联 ...