微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

XML之StAX二

XML之StAX(一)

XML之StAX(二)

面向Stream的StAX

XMLStreamReader

StAX中的XMLStreamReader类提供了一个Cursor形式的API,用于解析XML。和Iterator API一样,允许你确定何时访问下一个Event,这里的Event是元素开头,元素的结尾,一组text等。XMLStreamReader的next()方法不返回Events,而是移动Cursor到下一个XML的Event。你可以直接调用方法获取当前Event的更多信息,这和你迭代JDBC ResultSet的记录一样。下面是你可能遇到的XML Stream的Events,它们包含在javax.xml.stream.XMLStreamConstants:

  1. ATTRIBUTE
  2. CDATA
  3. CHaraCTERS
  4. COMMENT
  5. DTD
  6. END_DOCUMENT
  7. END_ELEMENT
  8. ENTITY_DECLaraTION
  9. ENTITY_REFERENCE
  10. NAMESPACE
  11. NOTATION_DECLaraTION
  12. PROCESSING_INSTRUCTION
  13. SPACE
  14. START_DOCUMENT
  15. START_ELEMENT

下面是一个简单的例子:

public static void read()throws IOException{
	XMLInputFactory factory = XMLInputFactory.newFactory();
	Reader reader = null;

	try {
//            reader = new FileReader("F:\\Codes\\IDEA\\Tools\\data\\xml\\test.xml");
		InputStream input = CursorAccess.class.getClassLoader().getResourceAsstream("test.xml");
		XMLStreamReader streamReader = factory.createXMLStreamReader(input);
		while (streamReader.hasNext()){
			int type = streamReader.next();

		  // streamReader.getEventType() == XMLStreamReader.START_ELEMENT == XMLStreamConstans.START_ELEMENT
		  // equals streamReader.isstartElement() and type==XMLStreamConstans.START_ELEMENT
			if(streamReader.isstartElement()){
				QName element = streamReader.getName();
				String name = element.toString();
				//
				if(name.equals("book")) {
					QName attrName = streamReader.getAttributeName(0);
					String attrValue = streamReader.getAttributeValue(0);
					System.out.println(element + ": " + attrName + "=" + attrValue);
				}

				else if(!name.equals("bookstore") && !name.equals("book")){
					String value = streamReader.getElementText();
					System.out.println(element + ": " + value);
				}
			}
		}
	}
	catch (Exception e){
		e.printstacktrace();
	}
	finally {
		if(reader != null) {
			reader.close();
		}
	}
}

和XMLEventReader一样,XMLStreamReader也可以自定义Filter:
public static void readFilter()throws IOException{
	XMLInputFactory factory = XMLInputFactory.newFactory();
	InputStream input = null;

	try {
		input = new FileInputStream(new File("F:\\Codes\\IDEA\\Tools\\data\\xml\\test.xml"));
		XMLStreamReader streamReader = factory.createFilteredReader(
				factory.createXMLStreamReader(input),new StreamFilter() {
					@Override
					public boolean accept(XMLStreamReader reader) {
						if(reader.isstartElement()){
							String name = reader.getName().toString();
							if(name.equals("title") || name.equals("price")){
								return true;
							}
						}
						return false;
					}
				});

		while (streamReader.hasNext()){
			streamReader.next();

			if(streamReader.isstartElement()){
				String name = streamReader.getLocalName();
				System.out.println(name + ": " + streamReader.getElementText());
			}
		}
	}
	catch (Exception e){
		e.printstacktrace();
	}
	finally {
		if(input != null){
			input.close();
		}
	}
}

XMLStreamWriter

XMLStreamWriter是用于生成XML的,不过不同于XMLEventWriter的是,它不要求为元素定义前缀:

public static void write(){
	XMLOutputFactory factory = XMLOutputFactory.newFactory();

	try {
		XMLStreamWriter writer = factory.createXMLStreamWriter(
				new FileWriter("F:\\Codes\\IDEA\\Tools\\data\\xml\\cursor.xml"));

		writer.writeStartDocument();
		writer.writeStartElement("test:bookstore");

		writer.writeStartElement("test:book");
		writer.writeAttribute("category","COmpuTER");
		writer.writeStartElement("author");
		writer.writeCharacters("Giada De Laurentiis");
		writer.writeEndElement();
		writer.writeEndElement();
		writer.writeEndElement();
		writer.writeEndDocument();

		writer.flush();
		writer.close();
	}
	catch (Exception e){
		e.printstacktrace();
	}
}


完整代码托管在:https://github.com/GatsbyNewton/xml-stax



参考文献:

http://www.w3school.com.cn/xml/index.asp

原文地址:https://www.jb51.cc/xml/295277.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。