XMLPull解析(3)-CURD

来源:互联网 发布:环境信息元数据规范 编辑:程序博客网 时间:2024/05/01 21:31

在增删改查之前要知道XMLPULL解析采取的是边处理、边解析的方式,处理完马上释放资源,从而不能进行及时修改。 

为了解决这个问题。我们可以借用List集合作为桥梁。先把xml数据全部读入集合中,然后对集合进行修改。 最后再重新写入XML文件。

  1、xml---List

  2、List---XML


    下面通过实例进行分析“:

        为了提供效率,进行了代码封装,把整个过程提炼成两个方法/:

 1.parseXml2List(String xmlName);
 2.
List2XML(List<Company> companies, String xmlName);


写入一个工具类ParseUitl中:

   

import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import org.xmlpull.v1.XmlPullParserFactory;import org.xmlpull.v1.XmlSerializer;public class ParseUtils {public static List parseXml2List(String xmlName) throws Exception {List<Company> companies = new ArrayList<Company>();Company company = null;// parseXml2ListXmlPullParserFactory factory = XmlPullParserFactory.newInstance();XmlPullParser xpp = factory.newPullParser();xpp.setInput(new FileInputStream(xmlName), "utf-8");int event;while ((event = xpp.getEventType()) != XmlPullParser.END_DOCUMENT) {if (event == XmlPullParser.START_TAG&& xpp.getName().equals("company")) {company = new Company();}if (event == XmlPullParser.START_TAG&& xpp.getName().equals("name")) {String name = xpp.nextText();company.setName(name);}if (event == XmlPullParser.START_TAG&& xpp.getName().equals("pnum")) {int pnum = Integer.parseInt(xpp.nextText());company.setPnum(pnum);}if (event == XmlPullParser.START_TAG&& xpp.getName().equals("address")) {String address = xpp.nextText();company.setAddress(address);}if (event == XmlPullParser.END_TAG&& xpp.getName().equals("company")) {companies.add(company);}xpp.next();}for (Company c : companies) {System.out.println(c.getName() + " " + c.getPnum() + " "+ c.getAddress() + "\n");}return companies;}public static void List2XML(List<Company> companies, String xmlName)throws Exception {XmlPullParserFactory factory = XmlPullParserFactory.newInstance();XmlSerializer serializer = factory.newSerializer();serializer.setOutput(new FileOutputStream(xmlName), "utf-8");serializer.startDocument("utf-8", true);serializer.startTag(null, "companies");for (Company c : companies) {serializer.startTag(null, "company");serializer.startTag(null, "name");serializer.text(c.getName());serializer.endTag(null, "name");serializer.startTag(null, "pnum");serializer.text(c.getPnum() + "");serializer.endTag(null, "pnum");serializer.startTag(null, "address");serializer.text(c.getAddress());serializer.endTag(null, "address");serializer.endTag(null, "company");}serializer.endTag(null, "companies");serializer.endDocument();}}

然后在测试类中调用两个方法,并对集合进行操作,完成对xml文件的修改,最后写回XML文件:

import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;import java.util.List;import org.junit.Test;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import org.xmlpull.v1.XmlPullParserFactory;import org.xmlpull.v1.XmlSerializer;public class XMLPulldemo {// 修改xml. 因为STAX是采用边处理边解析的模式,没有保存数据。 所以这里需要采用List集合来保存数据 ,起到中转站的作用。@Testpublic void demo4() throws Exception {List<Company> companies = ParseUtils.parseXml2List("book_bak3.xml");//增加Company对象 Company company=new Company(); company.setName("微软"); company.setPnum(3000); company.setAddress("美国"); companies.add(company);  //修改对象将阿里巴巴的pnum翻一倍; for (Company c : companies) {if(c.getName().equals("阿里巴巴")){c.setPnum(c.getPnum()*2);}} //删除腾讯对象 for (Company c : companies) { if(c.getName().equals("腾讯")){            companies.remove(c);            break; }} ParseUtils.List2XML(companies, "book_bak3.xml");}
}

以上就是XMLpull解析原理的入门介绍。

 

   


0 0