面向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:
- ATTRIBUTE
- CDATA
- CHaraCTERS
- COMMENT
- DTD
- END_DOCUMENT
- END_ELEMENT
- ENTITY_DECLaraTION
- ENTITY_REFERENCE
- NAMESPACE
- NOTATION_DECLaraTION
- PROCESSING_INSTRUCTION
- SPACE
- START_DOCUMENT
- 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 举报,一经查实,本站将立刻删除。