Java对XML文档进行解析(SAX、StAX解析)
2017-09-19 00:18
405 查看
SAX解析器方式入口:javax.xml.parsers包中的SAXParser解析器(通过getXMLReader获得文档阅读器)XMLReader
下面解析users.xml文件
StAX解析技术的入口:XMLEventReader (extends Iterator)
下面通过StAX对users.xml进行解析
package cn.hncu.stax;
import java.io.FileReader;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
/*
* Sax的技术入口:XMLReader,通过SAXParser解析器获取
* StAX技术的入口:XMLEventReader (extends Iterator)
*/
public class StaxDemo {
public static void main(String[] args) throws Exception,ClassCastException {
//1.通过XMLInputFactory
XMLInputFactory factory=XMLInputFactory.newFactory();
//createXMLEventReader(Reader reader) 根据 reader 创建一个新 XMLEventReader。
XMLEventReader reader=factory.createXMLEventReader(new FileReader("./xml/users.xml"));
//reader是一个迭代器,内部遍历出的每个元素是一个XMLEventReader对象
//2.遍历XML事件
while(reader.hasNext()){
XMLEvent event = reader.nextEvent();
if( event.isStartElement() ){
StartElement startElement = event.asStartElement();
//startElement.getName()返回的是一个qName对象
if(startElement.getName().getLocalPart().equals("user")){
String id=startElement.getAttributeByName(new QName("id")).getValue();
System.out.println("id:"+id);
}else if(startElement.getName().getLocalPart().equals("name")){
//获取文本内容 当前元素开始事件的下一个对象
Characters chs = reader.nextEvent().asCharacters();
System.out.println("name:"+chs.getData());
}else if(startElement.getName().getLocalPart().equals("age")){
//获取文本内容 当前元素开始事件的下一个对象
Characters chs = reader.nextEvent().asCharacters();
System.out.println("age:"+chs.getData());
}
}else if(event.isEndElement()){
if(event.asEndElement().getName().getLocalPart().equals("user")){
System.out.println("---------");
}
}
}
}
}
结果:
id:A1001
name:dragon
age:21
---------
id:A1002
name:Rose
age:19
---------
由以上对比可知,使用StAX对xml文档进行解析,更为灵活,所以建议采用StAX对xml文档进行解析
下面解析users.xml文件
<?xml version="1.0" encoding="UTF-8"?> <users> <user id="A1001" aa="aaa"> <name>dragon</name> <age>21</age> </user> <user id="A1002"> <name>Rose</name> <age>19</age> </user> </users>1.
@Test public void demo1() throws ParserConfigurationException, SAXException, FileNotFoundException, IOException{ //1.获得XML文档阅读器 SAXParser sax=SAXParserFactory.newInstance().newSAXParser(); XMLReader reader=sax.getXMLReader(); //2.设置阅读方式 reader.setContentHandler(new DefaultHandler(){ @Override public void startDocument() throws SAXException { System.out.println("1.开始阅读文档!"); } @Override public void endDocument() throws SAXException { System.out.println("4.文档阅读完毕"); } /** * uri - 名称空间 URI * localName - 本地名称(不带前缀), * qName - 限定名(带有前缀) * atts - 连接到元素上的属性 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { String str=""; for(int i=0;i<attributes.getLength();i++){ str+=attributes.getQName(i)+"="+attributes.getValue(i)+","; //获取所有的属性 } System.out.println("2.一个元素开始:"+qName+","+str); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println("3.一个元素结束:"+qName); } /** * ch - 来自 XML 文档的字符 * start - 数组中的开始位置 * length - 从数组中读取的字符的个数 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { String str = new String(ch, start, length); if(str.trim().length()!=0){ System.out.println("文本内容"+str); } } }); //3.阅读动作的触发 reader.parse("./xml/users.xml"); }结果:
1.开始阅读文档! 2.一个元素开始:users, 2.一个元素开始:user,id=A1001,aa=aaa, 2.一个元素开始:name, 文本内容dragon 3.一个元素结束:name 2.一个元素开始:age, 文本内容21 3.一个元素结束:age 3.一个元素结束:user 2.一个元素开始:user,id=A1002, 2.一个元素开始:name, 文本内容Rose 3.一个元素结束:name 2.一个元素开始:age, 文本内容19 3.一个元素结束:age 3.一个元素结束:user 3.一个元素结束:users 4.文档阅读完毕2.
/** * 把users.xml中的信息读取出来,按如下格式输出 * id:A1001 * name:dragon * age:21 * ------------- * id:A1002 * name:Rose * age:19 */ @Test public void demo2() throws ParserConfigurationException, Exception{ //获取XMLReader文档阅读器 SAXParser sax = SAXParserFactory.newInstance().newSAXParser(); XMLReader reader=sax.getXMLReader(); //设置阅读器 reader.setContentHandler(new DefaultHandler(){ private String elementName=""; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if(qName.equals("user")){ String id=attributes.getValue("id"); System.out.println("id:"+id); }else if(qName.equals("name") || qName.equals("age")){ elementName=qName; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { elementName=""; if(qName.equals("user")){ System.out.println("----------"); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(!elementName.equals("")){ System.out.println(elementName+":"+new String(ch, start, length)); } } }); //阅读动作的触发 reader.parse("./xml/users.xml"); }结果:
id:A1001 name:dragon age:21 ---------- id:A1002 name:Rose age:19 ----------
StAX解析技术的入口:XMLEventReader (extends Iterator)
下面通过StAX对users.xml进行解析
package cn.hncu.stax;
import java.io.FileReader;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
/*
* Sax的技术入口:XMLReader,通过SAXParser解析器获取
* StAX技术的入口:XMLEventReader (extends Iterator)
*/
public class StaxDemo {
public static void main(String[] args) throws Exception,ClassCastException {
//1.通过XMLInputFactory
XMLInputFactory factory=XMLInputFactory.newFactory();
//createXMLEventReader(Reader reader) 根据 reader 创建一个新 XMLEventReader。
XMLEventReader reader=factory.createXMLEventReader(new FileReader("./xml/users.xml"));
//reader是一个迭代器,内部遍历出的每个元素是一个XMLEventReader对象
//2.遍历XML事件
while(reader.hasNext()){
XMLEvent event = reader.nextEvent();
if( event.isStartElement() ){
StartElement startElement = event.asStartElement();
//startElement.getName()返回的是一个qName对象
if(startElement.getName().getLocalPart().equals("user")){
String id=startElement.getAttributeByName(new QName("id")).getValue();
System.out.println("id:"+id);
}else if(startElement.getName().getLocalPart().equals("name")){
//获取文本内容 当前元素开始事件的下一个对象
Characters chs = reader.nextEvent().asCharacters();
System.out.println("name:"+chs.getData());
}else if(startElement.getName().getLocalPart().equals("age")){
//获取文本内容 当前元素开始事件的下一个对象
Characters chs = reader.nextEvent().asCharacters();
System.out.println("age:"+chs.getData());
}
}else if(event.isEndElement()){
if(event.asEndElement().getName().getLocalPart().equals("user")){
System.out.println("---------");
}
}
}
}
}
结果:
id:A1001
name:dragon
age:21
---------
id:A1002
name:Rose
age:19
---------
由以上对比可知,使用StAX对xml文档进行解析,更为灵活,所以建议采用StAX对xml文档进行解析
相关文章推荐
- java中XML文档解析3 (sax和stax的使用)
- 使用SAX技术对XML文档进行解析范例
- Java解析XML文档SAX入门案例
- java与xml之SAX解析XML文档
- JAVA读取XML练习,JAVA读取XML文档,JAVA解析XML文档,JAVA与XML,XML文档解析,SAX (Simple API for XML)
- Java下3中XML解析 DOM方式、SAX方式和StAX方式
- java与xml之SAX解析XML文档
- java--DOM4j-SAXReader对xml文档的解析2
- JAVA解析XML的方式DOM、SAX、DOM4J、JDOM、StAX之比较
- SAX和STAX解析xml文档
- DOM方式解析XML文档(另2种方式为SAX,STAX),(第二种直接用sax方式用java类实现)
- JavaEE实战——XML文档DOM、SAX、STAX解析方式详解
- JAVA解析XML的方式DOM、SAX、DOM4J、JDOM、StAX之详解与比较
- JavaWeb 之 XML文档的DOM和SAX解析方式详解
- 【XML解析】(1)Java下使用JAXP中的DOM解析方式对XML文档进行解析
- [Java开发之路](11)SAX解析XML文档
- JavaWeb 之 XML文档的DOM和SAX解析方式详解
- java中使用JAXP解析xml(三)对XML文档中进行增、删、改
- JAVA解析XML的方式DOM、SAX、DOM4J、JDOM、StAX之比较
- 笔记:XML-解析文档-流机制解析器(SAX、StAX)