Stax处理XML(二)——基于迭代模型的查找和过滤器的使用

Stax处理XML,基于迭代模型的查找,关键在于:

使用XMLInputFactory创建XMLEventReader,获取了eventReader之后,(在while循环hasNext中)通过XMLEvent来获取是否是某种节点类型,通过event.asxxx转换节点。

(1)测试一:基于迭代模型的查找

	/**
	 * 基于迭代模型的查找
	 */
	@Test
	public void test04() {
		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来获取是否是某种节点类型
				XMLEvent event = reader.nextEvent();
				if (event.isStartElement()) {
					//通过event.asxxx转换节点
					String name = event.asStartElement().getName().toString();
					if (name.equals("title")) {
						System.out.print(reader.getElementText() + ": ");
					}
					if (name.equals("price")) {
						System.out.print(reader.getElementText() + "\n");
					}
				}
				num++;
			}
			System.out.println(num);
		} catch (XMLStreamException e) {
			e.printStackTrace();
		} finally {
			try {
				if(is != null)	is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}


输出结果:

Everyday Italian: 30.00
Harry Potter: 29.99
XQuery Kick Start: 49.99
Learning XML: 39.95
85

(2)测试二:基于Filter的过滤方式,可以有效的过滤掉不用进行操作的节点,然后while只在eventFilter返回的结果集中循环,减少循环次数、提高效率。

	/**
	 * 过滤器的使用
	 */
	@Test
	public void test05() {
		XMLInputFactory factory = XMLInputFactory.newInstance();
		InputStream is = null;
		try {
			is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
			//基于Filter的过滤方式,可以有效的过滤掉不用进行操作的节点,效率会高一些
			XMLEventReader reader = factory.createFilteredReader(factory.createXMLEventReader(is), 
					new EventFilter() {
						@Override
						public boolean accept(XMLEvent event) {
							//返回true表示会显示,返回false表示不显示
							if(event.isStartElement()) {
								String name = event.asStartElement().getName().toString();
								//eventReader结果集中只显示标题和价格
								if (("title").equals(name) || ("price").equals(name))
									return true;
							}
							return false;
						}
					});
			int num = 0;
			//while只在eventFilter返回的结果集中循环
			while(reader.hasNext()) {
				//通过XMLEvent来获取是否是某种节点类型
				XMLEvent event = reader.nextEvent();
				if (event.isStartElement()) {
					//通过event.asxxx转换节点
					String name = event.asStartElement().getName().toString();
					if (name.equals("title")) {
						System.out.print(reader.getElementText() + ": ");
					}
					if (name.equals("price")) {
						System.out.print(reader.getElementText() + "\n");
					}
				}
				num++;
			}
			System.out.println(num);
		} catch (XMLStreamException e) {
			e.printStackTrace();
		} finally {
			try {
				if(is != null)	is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}


输出结果:
Everyday Italian: 30.00
Harry Potter: 29.99
XQuery Kick Start: 49.99
Learning XML: 39.95
8

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值