Andorid——Create or ParserXml(Pull Dom)



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");
		      //设置是否standalone
			transformer.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 block
			e.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 {
			//创建一个DocumentBuilder
			DocumentBuilder builder = factory.newDocumentBuilder();
			//通过DocumentBuilder去创建一个Document
			Document 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){
						//判断节点名称是否是name
						if("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 block
			e.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则代表为no
			serializer.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>里面的张三i
				serializer.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,也可以是字节输入流InputStream
			parser.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();
		}
	}


。感谢您的提问。针对您的问题,可以使用以下代码将XML转换为JSON: ```java public static JSONObject xmlToJson(String xml) throws JSONException { JSONObject jsonObject = new JSONObject(); try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); XmlPullParser parser = factory.newPullParser(); parser.setInput(new StringReader(xml)); parse(parser, jsonObject); } catch (XmlPullParserException | IOException e) { e.printStackTrace(); } return jsonObject; } private static void parse(XmlPullParser parser, JSONObject jsonObject) throws XmlPullParserException, IOException, JSONException { int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { String tagName; switch (eventType) { case XmlPullParser.START_DOCUMENT: break; case XmlPullParser.START_TAG: tagName = parser.getName(); if (tagName.equalsIgnoreCase("item")) { jsonObject.put("item", parseItem(parser)); } break; case XmlPullParser.END_TAG: break; default: break; } eventType = parser.next(); } } private static JSONObject parseItem(XmlPullParser parser) throws XmlPullParserException, IOException, JSONException { JSONObject jsonObject = new JSONObject(); int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { String tagName; switch (eventType) { case XmlPullParser.START_DOCUMENT: break; case XmlPullParser.START_TAG: tagName = parser.getName(); if (tagName.equalsIgnoreCase("title")) { jsonObject.put("title", parseText(parser)); } else if (tagName.equalsIgnoreCase("link")) { jsonObject.put("link", parseText(parser)); } else if (tagName.equalsIgnoreCase("pubDate")) { jsonObject.put("pubDate", parseText(parser)); } break; case XmlPullParser.END_TAG: if (parser.getName().equalsIgnoreCase("item")) { return jsonObject; } break; default: break; } eventType = parser.next(); } return jsonObject; } private static String parseText(XmlPullParser parser) throws XmlPullParserException, IOException { String text = null; int eventType = parser.next(); if (eventType == XmlPullParser.TEXT) { text = parser.getText(); parser.nextTag(); } return text; } ``` 这段代码将XML数据解析为JSON对象,您可以将其用于您的Android应用的XML转JSON功能。 希望这些信息能够帮助到您。如果您还有其他问题,请随时提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值