zoukankan      html  css  js  c++  java
  • 使用 Pull 解析器操作 XML 文件

    一、使用Pull解析器读取 XML 文件

    除了可以使用 SAX 或 DOM 解析 XML 文件之外,大家也可以使用 Android 内置的 Pull 解析器解析 XML 文件。 Pull 解析器是一个开源的 Java 项目,既可以用于 Android,也可以用于 JavaEE。如果用在 JavaEE 需要把其 jar 文件放入类路径中,因为 Android 已经集成进了 Pull 解析器,所以无需添加任何 jar 文件。Android 系统本身使用到的各种 XML 文件,其内部也是采用 Pull 解析器进行解析的。 Pull 解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用 parser.next() 可以进入下一个元素并触发相应事件。跟 SAX 不同的是, Pull 解析器产生的事件是一个数字而非方法,因此可以使用一个 switch 对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText() 方法可以获取下一个 Text 类型节点的值。

    二、使用 Pull 解析器生成 XML 文件

    有些时候我们需要生成一个 XML 文件,生成 XML 文件的方法有很多,如:可以只使用一个 StringBuilder 组拼 XML 内容,然后把内容写入到文件中;或者使用 DOM API生成 XML 文件,或者也可以使用 Pull 解析器生成 XML 文件,这里推荐大家使用Pull解析器。

    使用Pull解析器生成一个与ljq.xml文件内容相同的myljq.xml文件,代码如下:

    File xmlFile = new File("myljq.xml");

    FileOutputStream outStream = new FileOutputStream(xmlFile);

    OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream, "UTF-8");

    BufferedWriter writer = new BufferedWriter(outStreamWriter);

    writeXML(persons, writer);

    writer.flush();

    writer.close();

    如果只想得到生成的 XML 字符串内容,可以使用StringWriter:

    StringWriter writer = new StringWriter();

    writeXML(persons, writer);

    String content = writer.toString();

    案例:

    persons.xml

    <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
    <persons>
    <person id="1">
    <name>zhangsan</name>
    <age>12</age>
    </person>
    <person id="2">
    <name>lisi</name>
    <age>34</age>
    </person>
    </persons>

    PullPersonService Pull 解析器操作类

    package com.ljq.service;

    import java.io.InputStream;
    import java.io.Writer;
    import java.util.ArrayList;
    import java.util.List;
    import org.xmlpull.v1.XmlPullParser;
    import org.xmlpull.v1.XmlSerializer;
    import com.ljq.entity.Person;
    import android.util.Xml;

    /**
    * Pull解析xml文件
    *
    @author jiqinlin
    */
    public class PullPersonService {

    /**
    * 使用pull解析器生成xml文件
    *
    *
    @param persons
    *
    @param writer
    *
    @return
    */
    public static String writeXML(List<Person> persons, Writer writer){
    XmlSerializer serializer = Xml.newSerializer();
    try {
    serializer.setOutput(writer);
    serializer.startDocument("UTF-8", true);
    //第一个参数为命名空间,如果不使用命名空间,可以设置为null
    serializer.startTag("", "persons");
    for (Person person : persons){
    serializer.startTag("", "person");
    serializer.attribute("", "id", person.getId().toString());
    serializer.startTag("", "name");
    serializer.text(person.getName());
    serializer.endTag("", "name");
    serializer.startTag("", "age");
    serializer.text(person.getAge().toString());
    serializer.endTag("", "age");
    serializer.endTag("", "person");
    }
    serializer.endTag("", "persons");
    serializer.endDocument();
    } catch (Exception e) {
    e.printStackTrace();
    }
    return writer.toString();
    }

    /**
    * 使用pull解析器解析xml文件
    *
    *
    @param inStream
    *
    @return
    *
    @throws Exception
    */
    public static List<Person> readXML(InputStream inStream) throws Exception {
    XmlPullParser parser = Xml.newPullParser();
    parser.setInput(inStream, "UTF-8");
    int eventType = parser.getEventType();
    Person currentPerson = null;
    List<Person> persons = null;
    while (eventType != XmlPullParser.END_DOCUMENT) {
    switch (eventType) {
    case XmlPullParser.START_DOCUMENT:// 文档开始事件,可以进行数据初始化处理
    persons = new ArrayList<Person>();
    break;
    case XmlPullParser.START_TAG:// 开始元素事件
    String name = parser.getName();
    if (name.equalsIgnoreCase("person")) {
    currentPerson = new Person();
    currentPerson.setId(new Integer(parser.getAttributeValue(null, "id")));
    } else if (currentPerson != null) {
    if (name.equalsIgnoreCase("name")) {
    currentPerson.setName(parser.nextText());// 如果后面是Text元素,即返回它的值
    } else if (name.equalsIgnoreCase("age")) {
    currentPerson.setAge(new Short(parser.nextText()));
    }
    }
    break;
    case XmlPullParser.END_TAG:// 结束元素事件
    if (parser.getName().equalsIgnoreCase("person")&& currentPerson != null) {
    persons.add(currentPerson);
    currentPerson = null;
    }
    break;
    }
    eventType = parser.next();
    }
    inStream.close();
    return persons;
    }

    }

    PullPersonServiceTest Pull 解析器测试类

    package com.ljq.test;

    import java.io.BufferedWriter;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStreamWriter;
    import java.util.ArrayList;
    import java.util.List;

    import com.ljq.entity.Person;
    import com.ljq.service.PullPersonService;

    import android.content.Context;
    import android.test.AndroidTestCase;
    import android.util.Log;

    public class PullPersonServiceTest extends AndroidTestCase{
    private final String TAG = "PullPersonServiceTest";
    /**
    * 使用pull解析器解析xml文件
    *
    *
    @throws Exception
    */
    public void testReadXML() throws Exception{
    //InputStream inputStream = PullPersonServiceTest.class.getClassLoader().getResourceAsStream("persons.xml");
    InputStream inputStream= this.getContext().openFileInput("persons.xml");
    List<Person> persons = PullPersonService.readXML(inputStream);
    for(Person person : persons){
    Log.i(TAG, person.getId() + " : " + person.getName() + " : " + person.getAge());
    }
    }

    /**
    * 使用pull解析器生成xml文件
    *
    *
    @throws Exception
    */
    public void testWriteXml() throws Exception{
    FileOutputStream fileOutputStream = this.getContext().openFileOutput("123.xml", Context.MODE_PRIVATE);
    OutputStreamWriter outStreamWriter = new OutputStreamWriter(fileOutputStream, "UTF-8");
    List<Person> persons = new ArrayList<Person>();
    persons.add(new Person(1, "zhangsan", (short)12));
    persons.add(new Person(2, "lisi", (short)34));
    BufferedWriter writer = new BufferedWriter(outStreamWriter);
    String string = PullPersonService.writeXML(persons, writer);
    Log.i(TAG, string.toString());
    }
    }



  • 相关阅读:
    5种Python使用定时调度任务的方式
    基于Tensorflow + Opencv 实现CNN自定义图像分类
    CANN 5.0硬核技术抢先看
    大力出奇迹,揭秘昇腾CANN的AI超能力
    MSQL:超强的多任务表示学习方法
    Shell:Lite OS在线调试工具知多少
    带你掌握Vue过滤器filters及时间戳转换
    Selenium系列(六) 详细解读强制等待、隐式等待、显式等待的区别和源码解读
    Linux常用命令 top命令详解(重点)
    Selenium系列(一) 详细解读8种元素定位方式
  • 原文地址:https://www.cnblogs.com/xpxpxp2046/p/2292009.html
Copyright © 2011-2022 走看看