Andorid——Create or ParserXml(Pull Dom)

来源:互联网 发布:淘宝网帽子冬季 编辑:程序博客网 时间:2024/06/06 02:10



1.Dom方式来操作xml。


(1).Dom方式创建xml文件:

private void createXml() throws FileNotFoundException {         OutputStream out = new FileOutputStream(new File(Environment.getExternalStorageDirectory(), "Domxml1.xml"));        try {                 /**                     *    Dom方式创建或者解析XML不同于Pull方式。                   *    Dom方式操作XML只有一种方式                   *    先实例化一个工厂,通过工厂去实例一个builer                   *    再调用builer去创建文件                   */                //创建工厂     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();       //创建一个XML生成器DocumentBuilder builder = factory.newDocumentBuilder();  //创建文件(xml文件) 可以理解为document就是一个xml文件Document document = builder.newDocument();              //创建一个info的节点Element infoElement = document.createElement("info");              //创建一个叫user的节点Element userElement = document.createElement("user");  //往info节点里面添加user节点,因此info节点是最外层的节点.  //可以理解为因为info节点没有添加到任何节点之中(没有用appendChild  //方法) 所以info节点深处XML文件的最外层或者最顶端infoElement.appendChild(userElement);  //为user节点去设置属性userElement.setAttribute("id", "1");                            //创建一个叫name的节点Element nameElement = document.createElement("name");  //name节点追加到user节点里面userElement.appendChild(nameElement);  //为name节点设置值。也就是<name></name>中间的值  //值也是节点重点一个子元素,不过不同的是值可以自己设定  //而不需要去像创建节点那样去创建值  //调用Document类的CreateTextNode方法去设置值nameElement.appendChild(document.createTextNode("张三"));Element ageElement = document.createElement("age");userElement.appendChild(ageElement);ageElement.appendChild(document.createTextNode("20"));Element sexElement = document.createElement("sex");userElement.appendChild(sexElement);sexElement.appendChild(document.createTextNode("男"));              //最后不要忘了往XML文件里面去添加最外层节点(info节点) document.appendChild(infoElement);                            //最重要的一点是Dom方式创建xml时,需要用一个转换器去将              //上面写好的内容的document转换为一个xml文本。              //而转换器(Transformer)也需要由一个工厂去创建                            //创建转换器工厂(TransformaerFactory)TransformerFactory transFactory = TransformerFactory.newInstance();  //创建转换器(Transformer)Transformer transformer = transFactory.newTransformer();                            //用转换器转换为XMl文件时给xml文件设置的属性              //例如:<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>                            //设置版本号transformer.setOutputProperty(OutputKeys.VERSION, "1.0");  //设置转换过程中的编码transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");      //设置是否standalonetransformer.setOutputProperty(OutputKeys.STANDALONE, "yes");  //设置转换方式transformer.setOutputProperty(OutputKeys.METHOD, "xml");  //设置转换之后的文件类型transformer.setOutputProperty(OutputKeys.MEDIA_TYPE, "xml");                          //创建输入源 将上面写好的文件用转换器去转换。              //document就是输入源。需要转换的数据源DOMSource domSource = new DOMSource(document);  //最后 开始转换  //transform()是将输入源的源文件转换成一个StreamResult  //里面第一个参数是输入源   //第二个是StreamResult 这个也是一个转换器  //将输入源简介转换为一个流   //实例化StreamResult有(StringWriter writer),  //(OutputStream out)(File file) 集中比较常用的方法transformer.transform(domSource, new StreamResult(out));} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}



(2).Dom方式解析xml文件:
private void parserXml(String str) {//Dom方式解析xml只有一种方式       使用工厂去调用DoucmentBuilder去创建Document//创建一个DOM工厂DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//因为是解析 所以需要输入流去读xml源文件StringReader reader = new StringReader(str);InputSource inputSource = new InputSource(reader);try {//创建一个DocumentBuilderDocumentBuilder builder = factory.newDocumentBuilder();//通过DocumentBuilder去创建一个DocumentDocument document = builder.parse(inputSource);//创建元素(Element) getDocumentElement()方法得到XML文件的根节点(最外层的节点)Element infoElement = document.getDocumentElement();//infoElement.getElementsByTagName("user")方法得到节点名字为user的所有节点,所以返回值应该是一个集合NodeList nodeList = infoElement.getElementsByTagName("user");//遍历集合for (int i = 0; i < nodeList.getLength(); i++) {//得到某一个user节点。NodeList.item(index)方法传入一个index下标位置去获得相应的user节点Element userElement=(Element) nodeList.item(i);//然后通过user节点获取所有的子节点,返回值也是一个集合NodeList userChildList=userElement.getChildNodes();//再遍历装有所有子元素的集合for(int j = 0; j < userChildList.getLength(); j++){//得到某一个子元素Element childElement=(Element) userChildList.item(j);//判断子元素是否是节点if(childElement.getNodeType()==Node.ELEMENT_NODE){//判断节点名称是否是nameif("name".equals(childElement.getNodeName())){//childElement.getFirstChild().getNodeValue()得到节点之间的值。//无论有多少个值,都是getFirstChild().getNodeValue()方法去获得值System.out.println(childElement.getFirstChild().getNodeValue());}else if(childElement.getNodeName().equals("sex")){System.out.println(childElement.getFirstChild().getNodeValue());}}}}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}



1.Pull方式来操作xml。

(1).Pull方式创建xml文件:
private String createXml() {/** * 用pull方式创建xml 第一种方式 :使用工厂 XmlPullParserFactory factory = * XmlPullParserFactory.newInstance(); 创建工厂 XmlSerializer serializer2 = * factory.newSerializer(); 调用工厂创建xml生成器 第二种方式:直接创建生成器 */// 创建xml// 创建xml生成器XmlSerializer serializer = Xml.newSerializer();StringWriter writer = new StringWriter();try {// 设置输出的方式,可以是Writer字符流也可以是OutPutStream字节流serializer.setOutput(writer);// 设置文件格式。第一个参数代表编码格式,第二个代表 xml的头部文件中的standalone属性。// 如果为ture则代表为yes,为false则代表为noserializer.startDocument("UTF-8", true);// 设置xml根节点(最外层节点)第一个参数是这个节点所对应键(一般不用)// 有starTag就有endTag 一定要有顺序。因为是跟节点。所以starTag和endTag皆在最外面serializer.startTag("", "userinfo");for (int i = 0; i <= 2; i++) {// 在userinfo根节点里面创建一个user节点serializer.startTag("", "user");// 为这个节点声明属性serializer.attribute("", "id", i + "");// 再从user节点里面创建一个name节点serializer.startTag("", "name");// 那么节点里面的值。也就是<name>张三i</name>里面的张三iserializer.text("张三" + i);// 结束name节点serializer.endTag("", "name");serializer.startTag("", "sex");serializer.text("男");serializer.endTag("", "sex");// 结束包裹 sex节点 name节点 的user节点serializer.endTag("", "user");}// 结束最外层的节点serializer.endTag("", "userinfo");// 最后结束XML文件、这样XML文件的内部内容就已经写好了。serializer.endDocument();} catch (Exception e) {e.printStackTrace();}    /**     * File file = new File(Environment.getExternalStorageDirectory(),     * "PullCreateXml.xml");      * try {     * FileOutputStream fileOutPut = newFileOutputStream(file);      * 将创建好的xml内容输出到sdk保存为xml文件     * fileOutPut.write(createXml().getBytes());     * fileOutPut.close() } catch     * (Exception e) { e.printStackTrace(); }      */     // 通过流返回xml的内容return writer.toString();}


(1).Pull方式解析xml文件:
private void parserXml(String str) {/** * 用pull方式解析xml  * 第一种方式 :使用工厂  * XmlPullParserFactory factory =XmlPullParserFactory.newInstance(); 创建工厂 * XmlPullParser pullParser = factory.newPullParser(); 调用工厂创建xml解析器 * 第二种方式:直接创建解析器 *///创建pull解析器XmlPullParser parser = Xml.newPullParser();//因为是解析所以需要xml文件,也就需要输入流去读取xml文件给PullParser解析器去解析StringReader reader = new StringReader(str);//实例化一个字符输入流try {//解析器设置输入的方式,可以是字符输入流Reader,也可以是字节输入流InputStreamparser.setInput(reader);//解析器得到xml中的节点事件int event = parser.getEventType();//判断事件如果不是END_DOCUMENT则继续解析。END_DOCUMENT代表XML文件是否结束while (event != XmlPullParser.END_DOCUMENT) {switch (event) {//如果是XML的根节点(最外层节点)case XmlPullParser.START_DOCUMENT:System.out.println("开始解析");break;//如果是XML的节点case XmlPullParser.START_TAG:Map<String, Object> map = new HashMap<String, Object>();//判断节点名称是否是user parser,getName()可以得到当前解析的节点的名字if ("user".equals(parser.getName())) {    //parser.getAttributeValue()可以得到节点中的属性值,第一个参数是键名(一般为空)map.put("user_id", parser.getAttributeValue("", "id"));} else if ("name".equals(parser.getName())) {//parset.nextText()得到此节点的值map.put("name", parser.nextText());} else if ("sex".equals(parser.getName())) {map.put("sex", parser.nextText());}datalist.add(map);break;//如果是xml的结束节点(也就是</name>之类的节点)case XmlPullParser.END_TAG:System.out.println("结束解析");break;}//最后走完一个节点轮回的时候又让解析器去解析下一个节点轮回/** * <user> *   <name> *   </name> * </user> * 相当于此user节点已经解析完,解析下一个user节点 */event = parser.next();}System.out.println(datalist);listView.setAdapter(new SimpleAdapter(this,datalist,R.layout.item,new String[] { "user_id", "name", "sex" },new int[] { R.id.textView1, R.id.textView2, R.id.textView3 }));} catch (Exception e) {e.printStackTrace();}}


0 1