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"/>

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Pull解析器生成XML文件的一般步骤如下: 1. 创建一个XmlSerializer对象,该对象将用于序列化XML数据。 2. 使用XmlSerializer对象创建一个XmlWriter对象,该对象将用于将XML数据写入文件。 3. 使用XmlWriter对象的WriteStartDocument方法写入XML文件的开头。 4. 使用XmlWriter对象的WriteStartElement方法写入根元素的开始标记。 5. 使用XmlWriter对象的WriteElementString方法写入子元素的标记和值。 6. 使用XmlWriter对象的WriteEndElement方法写入根元素的结束标记。 7. 使用XmlWriter对象的WriteEndDocument方法写入XML文件的结尾。 8. 关闭XmlWriter对象。 下面是一个使用Pull解析器生成XML文件的示例代码: ``` java import java.io.FileWriter; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; public class XmlGenerator { public static void main(String[] args) { try { // 创建一个XMLOutputFactory对象 XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); // 创建一个XMLStreamWriter对象 XMLStreamWriter writer = outputFactory .createXMLStreamWriter(new FileWriter("output.xml")); // 写入XML文件的开头 writer.writeStartDocument(); // 写入根元素的开始标记 writer.writeStartElement("root"); // 写入子元素的标记和值 writer.writeStartElement("child"); writer.writeCharacters("Hello World!"); writer.writeEndElement(); // 写入根元素的结束标记 writer.writeEndElement(); // 写入XML文件的结尾 writer.writeEndDocument(); // 关闭XMLStreamWriter对象 writer.close(); System.out.println("XML文件生成!"); } catch (Exception e) { e.printStackTrace(); } } } ``` 执行该代码后,将在项目根目录下生成名为"output.xml"的XML文件,其内容如下: ``` xml <?xml version="1.0" ?> <root> <child>Hello World!</child> </root> ``` 注意:上述示例代码中使用的是Java语言的StAX API,而不是Pull解析器。不过,StAX API提供了一种类Pull解析器的编程模型,可以方便地生成XML文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值