您的位置:首页 > 编程语言 > Java开发

XML之StAX(二)

2016-04-30 15:41 281 查看
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:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  StAX Java XML