Java解析xml的主要解析器: SAX和DOM的选择(附上新方法--Pull解析)
- <?xml version="1.0" encoding="UTF-8"?>
- <books>
- <book id="12">
- <name>thinking in java</name>
- <price>85.5</price>
- </book>
- <book id="15">
- <name>Spring in Action</name>
- <price>39.0</price>
- </book>
- </books>
- public class Book {
- private int id;
- private String name;
- private float price;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public float getPrice() {
- return price;
- }
- public void setPrice(float price) {
- this.price = price;
- }
- @Override
- public String toString(){
- return this.id+":"+this.name+":"+this.price;
- }
- }
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.List;
- import javax.xml.parsers.DocumentBuilder;
- import javax.xml.parsers.DocumentBuilderFactory;
- import org.w3c.dom.Document;
- import org.w3c.dom.Element;
- import org.w3c.dom.NodeList;
- import org.w3c.dom.Node;
- import com.xtlh.cn.entity.Book;
- public class DomParseService {
- public List<Book> getBooks(InputStream inputStream) throws Exception{
- List<Book> list = new ArrayList<Book>();
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- DocumentBuilder builder = factory.newDocumentBuilder();
- Document document = builder.parse(inputStream);
- Element element = document.getDocumentElement();
- NodeList bookNodes = element.getElementsByTagName("book");
- for(int i=0;i<bookNodes.getLength();i++){
- Element bookElement = (Element) bookNodes.item(i);
- Book book = new Book();
- book.setId(Integer.parseInt(bookElement.getAttribute("id")));
- NodeList childNodes = bookElement.getChildNodes();
- // System.out.println("*****"+childNodes.getLength());
- for(int j=0;j<childNodes.getLength();j++){
- if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE){
- if("name".equals(childNodes.item(j).getNodeName())){
- book.setName(childNodes.item(j).getFirstChild().getNodeValue());
- }else if("price".equals(childNodes.item(j).getNodeName())){
- book.setPrice(Float.parseFloat(childNodes.item(j).getFirstChild().getNodeValue()));
- }
- }
- }//end for j
- list.add(book);
- }//end for i
- return list;
- }
- }
- public class ParseTest extends TestCase{
- public void testDom() throws Exception{
- InputStream input = this.getClass().getClassLoader().getResourceAsStream("book.xml");
- DomParseService dom = new DomParseService();
- List<Book> books = dom.getBooks(input);
- for(Book book : books){
- System.out.println(book.toString());
- }
- }
- }
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.List;
- import javax.xml.parsers.SAXParser;
- import javax.xml.parsers.SAXParserFactory;
- import org.xml.sax.Attributes;
- import org.xml.sax.SAXException;
- import org.xml.sax.helpers.DefaultHandler;
- import com.xtlh.cn.entity.Book;
- public class SaxParseService extends DefaultHandler{
- private List<Book> books = null;
- private Book book = null;
- private String preTag = null;//作用是记录解析时的上一个节点名称
- public List<Book> getBooks(InputStream xmlStream) throws Exception{
- SAXParserFactory factory = SAXParserFactory.newInstance();
- SAXParser parser = factory.newSAXParser();
- SaxParseService handler = new SaxParseService();
- parser.parse(xmlStream, handler);
- return handler.getBooks();
- }
- public List<Book> getBooks(){
- return books;
- }
- @Override
- public void startDocument() throws SAXException {
- books = new ArrayList<Book>();
- }
- @Override
- public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
- if("book".equals(qName)){
- book = new Book();
- book.setId(Integer.parseInt(attributes.getValue(0)));
- }
- preTag = qName;//将正在解析的节点名称赋给preTag
- }
- @Override
- public void endElement(String uri, String localName, String qName)
- throws SAXException {
- if("book".equals(qName)){
- books.add(book);
- book = null;
- }
- preTag = null;/**当解析结束时置为空。这里很重要,例如,当图中画3的位置结束后,会调用这个方法
- ,如果这里不把preTag置为null,根据startElement(....)方法,preTag的值还是book,当文档顺序读到图
- 中标记4的位置时,会执行characters(char[] ch, int start, int length)这个方法,而characters(....)方
- 法判断preTag!=null,会执行if判断的代码,这样就会把空值赋值给book,这不是我们想要的。*/
- }
- @Override
- public void characters(char[] ch, int start, int length) throws SAXException {
- if(preTag!=null){
- String content = new String(ch,start,length);
- if("name".equals(preTag)){
- book.setName(content);
- }else if("price".equals(preTag)){
- book.setPrice(Float.parseFloat(content));
- }
- }
- }
- }
- import java.io.InputStream;
- import java.util.List;
- import junit.framework.TestCase;
- import com.xtlh.cn.demo.DomParseService;
- import com.xtlh.cn.demo.SaxParseService;
- import com.xtlh.cn.entity.Book;
- public class ParseTest extends TestCase{
- public void testSAX() throws Throwable{
- SaxParseService sax = new SaxParseService();
- InputStream input = this.getClass().getClassLoader().getResourceAsStream("book.xml");
- List<Book> books = sax.getBooks(input);
- for(Book book : books){
- System.out.println(book.toString());
- }
- }
- }
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.List;
- import org.xmlpull.v1.XmlPullParser;
- import android.util.Xml;
- import com.xtlh.cn.entity.Book;
- public class PullParseService {
- public static List<Book> getBooks(InputStream inputStream) throws Exception{
- List<Book> books = null;
- Book book = null;
- XmlPullParser parser = Xml.newPullParser();
- parser.setInput(inputStream, "UTF-8");
- int event = parser.getEventType();//产生第一个事件
- while(event!=XmlPullParser.END_DOCUMENT){
- switch(event){
- case XmlPullParser.START_DOCUMENT://判断当前事件是否是文档开始事件
- books = new ArrayList<Book>();//初始化books集合
- break;
- case XmlPullParser.START_TAG://判断当前事件是否是标签元素开始事件
- if("book".equals(parser.getName())){//判断开始标签元素是否是book
- book = new Book();
- book.setId(Integer.parseInt(parser.getAttributeValue(0)));//得到book标签的属性值,并设置book的id
- }
- if(book!=null){
- if("name".equals(parser.getName())){//判断开始标签元素是否是name
- book.setName(parser.nextText());
- }else if("price".equals(parser.getName())){//判断开始标签元素是否是price
- book.setPrice(Float.parseFloat(parser.nextText()));
- }
- }
- break;
- case XmlPullParser.END_TAG://判断当前事件是否是标签元素结束事件
- if("book".equals(parser.getName())){//判断结束标签元素是否是book
- books.add(book);//将book添加到books集合
- book = null;
- }
- break;
- }
- event = parser.next();//进入下一个元素并触发相应事件
- }//end while
- return books;
- }
- }
- import java.io.InputStream;
- import java.util.List;
- import android.test.AndroidTestCase;
- import android.util.Log;
- import com.xtlh.cn.entity.Book;
- import com.xtlh.cn.service.PullParseService;
- public class testPullParseService extends AndroidTestCase{
- private static final String TAG = "testPullParseService";
- public void testPull() throws Exception{
- InputStream input = this.getClass().getClassLoader().getResourceAsStream("book.xml");
- PullParseService pull = new PullParseService();
- List<Book> books = pull.getBooks(input);
- for(Book book : books){
- Log.i(TAG,book.toString());
- }
- }
- }
Java解析xml的主要解析器: SAX和DOM的选择(附上新方法--Pull解析)相关推荐
- Hugging Face实战(NLP实战/Transformer实战/预训练模型/分词器/模型微调/模型自动选择/PyTorch版本/代码逐行解析)下篇之模型训练
模型训练的流程代码是不是特别特别多啊?有的童鞋看过Bert那个源码写的特别特别详细,参数贼多,运行一个模型百八十个参数的. Transformer对NLP的理解是一个大道至简的感觉,Hugging F ...
- java解析xml文件四种方式介绍、性能比较和基本使用方法
2019独角兽企业重金招聘Python工程师标准>>> 一.基本介绍: 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准. ...
- android用sax解析xml,详解android使用SAX解析XML文件
解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析. DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以根据DOM接口来操作这个树结构了. 优点:整个 ...
- java模仿贴吧发帖_贴吧发帖顶贴的新方法,解析了这些技巧你也可以成大神!...
贴吧引流一直是热门的一个技巧,很多人因为太过于依赖机器操作,所以在真正的规则面前的那种解读不到位,会导致自己在手动发文的时候经常出现秒删的问题. 那忙呀办法了?我们的中国人的智慧是很厉害的,所以不会出 ...
- SAX解析XML 详解
JAVA 解析 XML 通常有两种方式,DOM 和 SAX.DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一个 ...
- java怎么xml文件解析_Java对Xml文件解析
JAVA 解析 XML 通常有两种方式,DOM 和 SAX. DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一 ...
- Android中三种常用解析XML的方式(DOM、SAX、PULL)简介及区别
XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能.今天就由我向大家介绍一下在Android平台下几种常见的XML解 ...
- XML解析(一),SAX解析XML
转载自 XML解析(一),SAX解析XML 一.概述 SAX,全称Simple API for XML,是一种以事件驱动的XMl API,是XML解析的一种新的替代方法,解析XML常用的还有DOM ...
- Java菜鸟补给站--HTML,XML,以及解析XML
目录 HTML,XML的区别 解析XML DOM解析 SAX解析 选择DOM还是选择SAX? DOM4J解析 JDOM解析 HTML,XML的区别 1. XML是区分大小写字母的,HTML不区分. 2 ...
最新文章
- 整合公司3个网站后台管理子系统的经验总结 - 实现多系统的单点登录(ASP.NET + ASP)...
- IDC公布2017年亚太地区数据中心10大预测
- 【NodeJS】运行在服务端的JavaScript
- [Qt教程] 第38篇 网络(八)TCP(二)
- Spring原始注解和新注解(使用注解代替xml配置文件)
- 使用临时文件mkstemp和输出errno对应的错误描述信息strerror
- 小程序购物车抛物线(贝塞尔曲线实现)
- Java8 Stream详解~排序:sorted
- 使用js实现思维导图
- loadrunner11录制无法打开IE浏览器
- a ppt of CRF
- 眉山市谷歌高清卫星地图下载
- win7下开启梦幻桌面
- 加速计/陀螺仪/磁力计是什么,3轴/6轴/9轴传感器又是什么?
- Win10调整各窗口的任务栏位置
- 网赚:通过网上引流项目变现要趁早!
- go 错误处理与测试
- HTTP1.1协议中文版-RFC2616
- el-dialog组件实现可以拖拽移动功能
- Spring IoC是什么
热门文章
- Spring Boot返回的数据格式是XML 而不是JSON之原因探求的和解决
- 第1章 Ext JS开发基本环境准备与项目创建[3/4]
- flowable工作流 流程变量_信也科技工作流平台的技术实践
- windos 为什么会突然服务停止了_女生为什么会突然说分手?
- index.php s 1 last,Nginx常用rewrite跳转重定向实例
- 如何在柱状图中点连线_如何快速掌握MSA
- 佳能102种相片风格_一位妈妈用蔬菜水果等,为女儿拍了一组相片,没想到在INS火了...
- Could not create a validated object, cause: ValidateObject failed
- oracle12c order by,oracle 数据库中order by 的一些高级用法
- 揪出数据库中看不见的字符