使用JAVA自带的API XStream读取XML文件

本文详细介绍了如何利用JAVA自带的API XStream库来读取XML文件,讲解了相关步骤和关键代码示例,帮助开发者理解XML到Java对象的转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

book.xml

<?xml version="1.0" encoding="UTF-8"?>

<bookstore>

<book category="COOKING">
  <title lang="en">Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>

<book category="CHILDREN">
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

<book category="WEB">
  <title lang="en">XQuery Kick Start</title>
  <author>James McGovern</author>
  <author>Per Bothner</author>
  <author>Kurt Cagle</author>
  <author>James Linn</author>
  <author>Vaidyanathan Nagarajan</author>
  <year>2003</year>
  <price>49.99</price>
</book>

<book category="WEB">
  <title lang="en">Learning XML</title>
  <author>Erik T. Ray</author>
  <year>2003</year>
  <price>39.95</price>
</book>

</bookstore>

测试类:TestStax.java

package com.xml.stax;

import java.io.IOException;
import java.io.InputStream;

import javax.xml.stream.EventFilter;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.XMLEvent;

import org.junit.Test;

public class TestStax {
	@Test
	public void test1(){
		XMLInputFactory factory = XMLInputFactory.newInstance();
		InputStream is = null;
		try {
			is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
			XMLStreamReader reader = factory.createXMLStreamReader(is);
			while(reader.hasNext()){
//				System.out.println(reader.next());
				int type = reader.next();
				//判断节点的类型 是开始节点 文本节点 或者 结束节点 再进行处理
				if(type == XMLStreamConstants.START_ELEMENT){
					System.out.println(reader.getName().toString());
				}else if(type == XMLStreamConstants.CHARACTERS){
					System.out.println(reader.getText());
				}else if(type == XMLStreamConstants.END_ELEMENT){
					System.out.println(reader.getName());
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(is != null){
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	@Test
	public void test2(){
		XMLInputFactory factory = XMLInputFactory.newInstance();
		InputStream is = null;
		try {
			is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
			XMLStreamReader reader = factory.createXMLStreamReader(is);
			while(reader.hasNext()){
//				System.out.println(reader.next());
				int type = reader.next();
				if(type == XMLStreamConstants.START_ELEMENT){
//					System.out.println(reader.getName().toString());
					String name = reader.getName().toString();
					if("book".equals(name)){
						System.out.println(reader.getAttributeName(0)+":"+reader.getAttributeValue(0));
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(is != null){
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	@Test
	public void test3(){
		XMLInputFactory factory = XMLInputFactory.newInstance();
		InputStream is = null;
		try {
			is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
			XMLStreamReader reader = factory.createXMLStreamReader(is);
			while(reader.hasNext()){
//				System.out.println(reader.next());
				int type = reader.next();
				if(type == XMLStreamConstants.START_ELEMENT){
//					System.out.println(reader.getName().toString());
					String name = reader.getName().toString();
					if("title".equals(name)){
						System.out.print(reader.getElementText()+":");
					}
					
					if("price".equals(name)){
						System.out.print(reader.getElementText()+"\n");
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(is != null){
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	@Test
	public void test4(){
		XMLInputFactory factory = XMLInputFactory.newInstance();
		InputStream is = null;
		try {
			is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
			XMLEventReader reader = factory.createXMLEventReader(is);
			//基于迭代类型的操作方式
			int num = 0;
			while(reader.hasNext()){
				XMLEvent event = reader.nextEvent();
				//通过XMLEvent来判断是何种类型
				if(event.isStartElement()){
					//再进行装换
					String name = event.asStartElement().getName().toString();
					if("title".equals(name)){
						System.out.print(reader.getElementText()+":");
					}
					
					if("price".equals(name)){
						System.out.print(reader.getElementText()+"\n");
					}
				}
				num ++;
			}
			System.out.println(num);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(is != null){
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	@Test
	public void test5(){
		XMLInputFactory factory = XMLInputFactory.newInstance();
		InputStream is = null;
		try {
			//增加过滤器 减少迭代的次数
			is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
			XMLEventReader reader = factory.createFilteredReader(factory.createXMLEventReader(is), new EventFilter() {
				@Override
				public boolean accept(XMLEvent event) {
					if(event.isStartElement()){
						String name = event.asStartElement().getName().toString();
						if("title".equals(name) || "price".equals(name)){
							return true;
						}
					}
					return false;
				}
			});
			int num = 0;
			//基于迭代类型的操作方式
			while(reader.hasNext()){
				XMLEvent event = reader.nextEvent();
				if(event.isStartElement()){
					String name = event.asStartElement().getName().toString();
					if("title".equals(name)){
						System.out.print(reader.getElementText()+":");
					}
					
					if("price".equals(name)){
						System.out.print(reader.getElementText()+"\n");
					}
				}
				num ++;
			}
			System.out.println(num);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(is != null){
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值