• Pull解析器解析XML文件和生成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类型节点的值。
    有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中;或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,这里推荐大家使用Pull解析器。
     
     1 使用代码如下(生成XML文件):
     2 File xmlFile = new File("myitcast.xml");
     3 FileOutputStream outStream = new FileOutputStream(xmlFile);
     4 OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream, "UTF-8");
     5 BufferedWriter writer = new BufferedWriter(outStreamWriter);
     6 writeXML(persons, writer);
     7 writer.flush();
     8 writer.close();
     9 如果只想得到生成的xml字符串内容,可以使用StringWriter:
    10 StringWriter writer = new StringWriter();
    11 writeXML(persons, writer);
    12 String content = writer.toString();
       相关代码:
      PersonService.java
      1 public class PersonService {
      2     private Context context;
      3     
      4     public PersonService(Context context) {
      5         this.context = context;
      6     }
      7 
      8     /**
      9      * 把person.xml的输入流 解析 转化成list集合 
     10      * @param filename  assets目录下的文件名 
     11      * @return
     12      */
     13     public List<Person> getPersons(String filename){
     14         AssetManager manager = context.getAssets();
     15         try {
     16             InputStream  is = manager.open(filename);
     17             //在android下使用pull解析xml文件 
     18             //1.获取pull解析器的实例
     19             XmlPullParser  parser = Xml.newPullParser();
     20             //2.设置解析器的一些参数 
     21             parser.setInput(is, "utf-8");
     22             // 获取pull解析器对应的事件类型 
     23             int type = parser.getEventType();
     24             Person person = null;
     25             List<Person> persons = new ArrayList<Person>();
     26             while(type!=XmlPullParser.END_DOCUMENT){
     27     
     28                 if(type==XmlPullParser.START_TAG){
     29                     if("person".equals(parser.getName())){
     30                         person = new Person();
     31                         int id =Integer.parseInt( parser.getAttributeValue(0));
     32                         person.setId(id);
     33                     }else if("name".equals(parser.getName())){
     34                         String name = parser.nextText();
     35                         person.setName(name);
     36                     }else if("age".equals(parser.getName())){
     37                         int age = Integer.parseInt( parser.nextText());
     38                         person.setAge(age);
     39                     }
     40                 }
     41                 if(type==XmlPullParser.END_TAG){
     42                     if("person".equals(parser.getName())){
     43                         persons.add(person);
     44                         person = null;
     45                     }
     46                 }
     47                 
     48                 
     49                  type = parser.next();
     50             }
     51             
     52             return persons;
     53             
     54             
     55         } catch (Exception e) {
     56             e.printStackTrace();
     57             Toast.makeText(context, "获取person.xml失败", Toast.LENGTH_SHORT).show();
     58             return null;
     59         }
     60     }
     61     
     62     /**
     63      * 把persons集合里面的内容写到xml文件里面 
     64      * @param persons person的集合
     65      * @return
     66      */
     67     public boolean savePersonToXml(List<Person> persons){
     68         try {
     69             XmlSerializer  serializer =  Xml.newSerializer();
     70             // /sdcard/person.xml 
     71             // mount unmount 文件系统的权限 
     72             File file = new File(Environment.getExternalStorageDirectory(),"person.xml");
     73             FileOutputStream fos = new FileOutputStream(file);
     74             serializer.setOutput(fos, "utf-8");
     75             serializer.startDocument("utf-8", true);
     76             serializer.startTag(null, "persons");
     77             for(Person person:persons){
     78                 serializer.startTag(null, "person");
     79                 
     80                 serializer.attribute(null, "id", person.getId()+"");
     81                 
     82                 serializer.startTag(null,"name");
     83                 serializer.text(person.getName());
     84                 serializer.endTag(null, "name");
     85                 
     86                 serializer.startTag(null,"age");
     87                 serializer.text(person.getAge()+"");
     88                 serializer.endTag(null, "age");
     89                 
     90                 
     91                 serializer.endTag(null, "person");
     92             }
     93             serializer.endTag(null, "persons");
     94             serializer.endDocument();
     95             fos.flush();
     96             fos.close();
     97             return true;
     98         } catch (Exception e) {
     99             e.printStackTrace();
    100             return false;
    101         }
    102         
    103 
    104     }
    105     
    106 }

       MainActivity.java

     1 public class MainActivity extends Activity {
     2     /** Called when the activity is first created. */
     3     @Override
     4     public void onCreate(Bundle savedInstanceState) {
     5         super.onCreate(savedInstanceState);
     6         setContentView(R.layout.main);
     7         TextView tv = (TextView) this.findViewById(R.id.tv);
     8         PersonService service = new PersonService(this);
     9         List<Person> persons = service.getPersons("person.xml");
    10         StringBuffer sb = new StringBuffer();
    11         for(Person person : persons){
    12             String age = "年龄"+ person.getAge();
    13             String name  =person.getName();
    14             String id = "id="+ person.getId();
    15             sb.append(name +" "+ age+" "+id);
    16         }
    17         tv.setText( sb.toString());
    18     }
    19 }
     注意:写到sd卡中去,需要添加以下权限
      a)如何用api写sd卡,new File(Environment.getExternalStorageDirectory(),"person.xml")最好将下面两个权限都添加
      b)直接写出sd卡的路径,/sdcard/person.xml,只需要写sd卡的权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

     
  • 相关阅读:
    sql执行效率小结--待持续新加更新
    野路子学习esp32(十) NodeMcu-自定义固件@a.宏万
    野路子学习esp32(十) NodeMcu-网络应用@a.宏万
    野路子学习esp32(十) NodeMcu-WIFi@a.宏万
    野路子学习esp32(十) NodeMcu-GPIO@a.宏万
    野路子学习esp32(九) NodeMcu学习@a.宏万
    野路子学习esp32(八) GPIO 点亮LED@a.宏万
    野路子学习esp32(七) 新建一个应用@a.宏万
    EMQ 安装与部署 @a.宏万
    阿里云代码管理配置@a.宏万
  • 原文地址:https://www.cnblogs.com/hacket/p/3114257.html
Copyright © 2020-2023  润新知