Stax处理XML(一)——基于光标的查找

Stax处理XML,基于光标的查找,关键在于:

使用XMLInputFactory创建XMLStreamReader,获取了streamReader(光标)之后,(在while循环hasNext中)判断节点类型,是否为开始、结束、文本节点,之后根据情况进行处理。

(1)测试一:输出节点名称和text值

	/**
	 * 基于光标的查找
	 * 输出节点名称和text值
	 */
	@Test
	public void test01() {
		XMLInputFactory factory = XMLInputFactory.newInstance();
		InputStream is = null;
		try {
			//输入流
			is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
			XMLStreamReader reader = factory.createXMLStreamReader(is);
			while(reader.hasNext()) {
				int type = reader.next();
				//判断节点类型,是否为开始、结束、文本节点,之后根据情况进行处理
				if (type == XMLStreamConstants.START_ELEMENT) {
					System.out.println(reader.getName());
				} else if (type == XMLStreamConstants.CHARACTERS) {
					System.out.println(reader.getText().trim());
				} else if (type == XMLStreamConstants.END_ELEMENT) {
					System.out.println("/" + reader.getName());
				}
			}
		} catch (XMLStreamException e) {
			e.printStackTrace();
		} finally {
			try {
				if(is != null)	is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

输出结果:

bookstore

book

title
Everyday Italian
/title

author
Giada De Laurentiis
/author

year
2005
/year

price
30.00
/price

/book

book
...(此处省略)
/book

/bookstore

(2)测试二:输出属性,如果是book,就输出category

	/**
	 * 输出属性
	 * 如果是book,就输出category
	 */
	@Test
	public void test02() {
		XMLInputFactory factory = XMLInputFactory.newInstance();
		InputStream is = null;
		try {
			is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
			XMLStreamReader reader = factory.createXMLStreamReader(is);
			while(reader.hasNext()) {
				int type = reader.next();
				if (type == XMLStreamConstants.START_ELEMENT) {
					String name = reader.getName().toString();
					if (name.equals("book")) {
						System.out.println(reader.getAttributeName(0) + ": " + reader.getAttributeValue(0));
					}
				}
			}
		} catch (XMLStreamException e) {
			e.printStackTrace();
		} finally {
			try {
				if(is != null)	is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}


输出结果:

category: COOKING
category: CHILDREN
category: WEB
category: WEB

(3)测试三:输出书的标题和价格

	/**
	 * 输出书的标题和价格
	 */
	@Test
	public void test03() {
		XMLInputFactory factory = XMLInputFactory.newInstance();
		InputStream is = null;
		try {
			is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
			XMLStreamReader reader = factory.createXMLStreamReader(is);
			while(reader.hasNext()) {
				int type = reader.next();
				if (type == XMLStreamConstants.START_ELEMENT) {
					String name = reader.getName().toString();
					if (name.equals("title")) {
						System.out.print(reader.getElementText() + ": ");
					}
					if (name.equals("price")) {
						System.out.print(reader.getElementText() + "\n");
					}
				}
			}
		} 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

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念