首先定义一个接口
- packagecom.lei.xml;
-
- importjava.io.InputStream;
- importjava.util.List;
-
- publicinterfaceXMLParser{
-
- <T>List<T>xmlParse(InputStreamis);
-
- <T>StringxmlSerializer(List<T>list);
- }
1. PULL解析
解析速度快,事件处理,不会预加载整个文档
copy
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.StringWriter;
importjava.util.ArrayList;
importjava.util.List;
importorg.xmlpull.v1.XmlPullParser;
importorg.xmlpull.v1.XmlPullParserException;
importorg.xmlpull.v1.XmlSerializer;
importandroid.util.Xml;
classPullParseimplementsXMLParser{
staticPullParsegetInstance(){
returnnewPullParse();
}
public<T>List<T>xmlParse(InputStreamis){
List<Book>list=null;
Bookbook=null;
XmlPullParserparser=Xml.newPullParser();
//XmlPullParserparser=
//XmlPullParserFactory.newInstance().newPullParser();
try{
parser.setInput(is,"utf-8");
inttype=parser.getEventType();
while(type!=XmlPullParser.END_DOCUMENT){
switch(type){
caseXmlPullParser.START_DOCUMENT:
list=newArrayList<Book>();
break;
caseXmlPullParser.START_TAG:
if(parser.getName().equals("book")){
book=newBook();
}elseif(parser.getName().equals("id")){
type=parser.next();
book.setId(Integer.parseInt(parser.getText()));
if(parser.getName().equals("name")){
book.setName(parser.getText());
}
break;
caseXmlPullParser.END_TAG:
list.add(book);
catch(XmlPullParserExceptione){
e.printStackTrace();
catch(IOExceptione){
return(List<T>)list;
public<T>StringxmlSerializer(List<T>list){
List<Book>lists=(List<Book>)list;
XmlSerializerserializer=Xml.newSerializer();
serializer.startDocument("utf-8",true);
serializer.setOutput(newStringWriter());
serializer.startTag("","books");
for(Bookbook:lists){
serializer.startTag("","book");
serializer.attribute("","id",String.valueOf(book.getId()));
"name");
serializer.text(book.getName());
serializer.endTag("",248)"> serializer.endTag("",108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> serializer.endDocument();
}catch(IllegalArgumentExceptione){
e.printStackTrace();
catch(IllegalStateExceptione){
catch(IOExceptione){
returnserializer.toString();
}
2. SAX解析
树形结构,速度款,占用内存少,会预加载整个文档,适用于文档较小。
copy
importjava.util.ArrayList;
importjavax.xml.parsers.ParserConfigurationException;
importjavax.xml.parsers.SAXParser;
importjavax.xml.parsers.SAXParserFactory;
importorg.xml.sax.Attributes;
importorg.xml.sax.SAXException;
importorg.xml.sax.helpers.DefaultHandler;
importcom.lei.utils.Logs;
classSaxParseimplementsXMLParser{
staticSaxParsegetInstance(){
newSaxParse();
/**
*解析xml
*/
try{
SAXParserparser=SAXParserFactory.newInstance().newSAXParser();
MyXmlHandlerhandler=newMyXmlHandler();
parser.parse(is,handler);
return(List<T>)handler.getBookList();
catch(ParserConfigurationExceptione){
catch(SAXExceptione){
*生成xml
public<T>StringxmlSerializer(List<T>list){
classMyXmlHandlerextendsDefaultHandler{
List<Book>list;
Bookbook;
StringBuilderbuilder;
publicList<Book>getBookList(){
returnlist;
//入口,开始
@Override
voidstartDocument()throwsSAXException{
super.startDocument();
Logs.v("startDocument");
list=newArrayList<Book>();
builder=newStringBuilder();
//出口,结束
@Override
voidendDocument()throwsSAXException{
super.endDocument();
Logs.v("endDocument");
//开始解析开始标签
voidstartElement(Stringuri,StringlocalName,StringqName,
Attributesattributes)super.startElement(uri,localName,qName,attributes);
Logs.v("startElement"+"uri"+uri+"localName"+localName
+"qName"+qName);
if("book".equals(localName)){
builder.setLength(0);
//结束标签
voidendElement(Stringuri,StringqName)
super.endElement(uri,qName);
Logs.v("endElement"+"uri"+uri+"localName"+localName
if("id".equals(localName)){
book.setId(Integer.parseInt(builder.toString()));
if("name".equals(localName)){
book.setName(builder.toString());
//获取子标签的内容
voidcharacters(char[]ch,153); font-weight:bold; background-color:inherit">intstart,153); font-weight:bold; background-color:inherit">intlength)
super.characters(ch,start,length);
builder.append(ch,length);
Logs.v("characters"+newString(ch,length));
}
3.DOM解析
预先加载整个文档,占用内存大,不推荐使用
copy
importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuilderFactory;
importorg.w3c.dom.Document;
importorg.w3c.dom.Element;
importorg.w3c.dom.Node;
importorg.w3c.dom.NodeList;
importorg.xml.sax.SAXException;
classDomParsestaticDomParsegetInstance(){
newDomParse();
public<T>List<T>xmlParse(InputStreamis){
List<Book>list= DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
DocumentBuilderbuilder=factory.newDocumentBuilder();
Documentdoc=builder.parse(is);
Elementelement=doc.getElementById("book");
NodeListnodeList=element.getChildNodes();
Bookbook=for(inti=0;i<nodeList.getLength();i++){
Nodenode=nodeList.item(i);
book=newBook();
NodeListdetails=node.getChildNodes();
intj=0;j<details.getLength();j++){
if(node.getLocalName().equals("id")){
book.setId(Integer.parseInt(node.getNodeValue()));
if(node.getLocalName().equals("name")){
book.setName(node.getNodeValue());
list.add(book);
return(List<T>)list;
使用:
在 assets下放了一个books.xml
copy
privatevoidparseXmBySax(){
InputStreamis=getAssets().open("books.xml");
newSaxParse().xmlParse(is);
for(Bookbook:list){
mShowTv.append(book.toString());
voidparseXmByPull(){
InputStreamis= is=getAssets().open("books.xml");
List<Book>list=PullParse.getInstance().xmlParse(is);
for(Bookbook:list){
mShowTv.append(book.toString());
voidparseXmlByDom(){
InputStreamis= is=getAssets().open("books.xml");
}
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|