pull解析与生成xml文件

大家晚上好,今天给大家讲解的是pull解析与生成xml文件,这主要有两个效果,其一,将完整格式的xml解析,在listView列表显示,这个知识点就要运用上几讲关于适配器知识点来做,其二,自己定义标准格式的xml文件,生成并发放在内部储存中。


由于这次的代码比较多,我主要讲解关键的代码,其他布局什么的,就不讲,有不懂可以是底下问我。

1.PullActivity.java

private ListView bookList;
 private List<Map<String, Object>> data;
 private Context context;

 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_pull);

  bookList = (ListView) findViewById(R.id.list);
  context = this;

  try {
   //用输入流获取asset下的xml文件
   InputStream is = getAssets().open("book.xml");
   //调用业务层方法,方法的结果存在List的data值里
   data = fileManager.parse(is);

   //创建简单型适配器,参数一:上下文,参数二:要存的数据 参数三:layout布局  ,参数四:从哪里来,key值 ,参数五:到哪里去,布局对应的Id
   SimpleAdapter adapter = new SimpleAdapter(this, data,
     R.layout.item_list, new String[] { "name", "price" },
     new int[] { R.id.name_et, R.id.price_et });
   //设置适配器,展示数据
   bookList.setAdapter(adapter);

  } catch (Exception e) {
   e.printStackTrace();
  }

 }

 /**
  * 用按钮点击事件,导入xml文件到指定的文件夹
  */
 public void export(View v) {
  try {
   //获取导入的路径,getFilesDir()
   File rootPath = context.getFilesDir();
   //创建文件,参数一:路径 ,参数二:xml命名
   File file = new File(rootPath, "new2.xml");
  //输出流写入数据
   FileOutputStream fos = new FileOutputStream(file);
   Toast.makeText(context, "导入成功", Toast.LENGTH_SHORT).show();

//调用业务层的方法,传的参数是,data,fos,
   fileManager.export(data, fos);
   
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

 }

2.fileManager.java  业务层,主要书写方法

//定义声明

private static final String BOOK = "book";
 private static final String BOOKS = "books";
 private static final String NAME = "name";
 private static final String ID = "id";
 private static final String PRICE = "price";

 public static List<Map<String, Object>> parse(InputStream is)
   throws Exception {
  
  List<Map<String, Object>> data = null;
  HashMap<String, Object> map = null;

//创建解析器
  XmlPullParser parser = Xml.newPullParser();
  //设置编码方式
  parser.setInput(is, "utf-8");
  //获取xml类型
  int eventType = parser.getEventType();
 //当条件满足时,开始执行循环
  while (eventType != XmlPullParser.END_DOCUMENT) {

 //switch case 判断

   switch (eventType) {
  //开始文档
   case XmlPullParser.START_DOCUMENT:
    //初始化保存的列表
    data = new ArrayList<Map<String, Object>>();

    break;
   //开始标签
   case XmlPullParser.START_TAG:
    //得到开始标签下的属性值
    String name = parser.getName();

    //逐一开始判断,

  //属性值的BOOK时
    if (name.equals(BOOK)) {
     map = new HashMap<String, Object>();
    //得到id值
     String id = parser.getAttributeValue(0);
     map.put(ID, Integer.valueOf(id));

    //属性值Name时
    } else if (name.equals(NAME)) {

     map.put(NAME, parser.nextText());

//属性值为PRICE时
    } else if (name.equals(PRICE)) {
     map.put(PRICE, parser.nextText());
    }

    break;
   //结束标签
   case XmlPullParser.END_TAG:
    if (parser.getName().equals(BOOK)) {

 //添加到列表中
     data.add(map);
    }

    break;

   default:
    break;
   }

//最关键的地方,每次都要在往下执行一次
   eventType = parser.next();
  }

返回已有数据的data值

  return data;

 }

 /**
  * 导入文件方法
  */
 
 public static void export(List<Map<String, Object>> data,
   FileOutputStream fos) throws Exception {
  //创建序号器,它有个特点,有了开始,必定有结束
  XmlSerializer serializer = Xml.newSerializer();
  //输出流的格式
  serializer.setOutput(fos, "utf-8");
 //开始文档
  serializer.startDocument("utf-8", true);
 //开始标签,开始的标签的命名为BOOKS
  serializer.startTag(null, BOOKS);

 //用map集合进行data遍历
  for (Map map : data) {
   //下一个开始标签BOOK
   serializer.startTag(null, BOOK);
   //设置属性ID,用map得到id的实际值
   serializer.attribute(null, ID, map.get(ID).toString());
   //下一个开始标签,NAME
   serializer.startTag(null, NAME);
   //设置文本值
   serializer.text(map.get(NAME).toString());
   serializer.endTag(null, NAME);

 //设置下一个开始标签PRICE
   serializer.startTag(null, PRICE);
   //设置PRICE值
   serializer.text(map.get(PRICE).toString());

//结束标签
   serializer.endTag(null, PRICE);

   serializer.endTag(null, BOOK);
  }
  //结束标签有头也有尾
  serializer.endDocument();
  serializer.endTag(null, BOOKS);
  //关闭输出流
  fos.close();

  
 }



pull解析与生成就到这里,为什么要详细讲解这个解析呢,因为在我们做开发的时候,解析与生成xml最常用的方法就是pull,大家好好看看这篇博客,相信能给大家以后开发项目有用。时间过得很快,凌晨十二点多了,该洗洗睡,熬夜伤身,养好身体才有精力敲代码。晚安。


  • 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、付费专栏及课程。

余额充值