常见的XML解析有哪几种?
DOM解析;
PULL解析;(android自带的解析XML的技术)
JDOM解析;
SAX解析;
DOM4J
PULL解析示例代码:
<1>
我们要解析的XML文件已经放在本地应用的文件夹下或者是网络上的
注意:这样的话这两种情况都需要在功能清单文件下注册好权限。
<2>
XmlPullParser:XML拉式剖析器
android的pull解析有以下过程:
XmlPullParser.getEventType:主要获取当前解析器位于哪个节点上。
XmlPullParser.getName:主要是用来获取处在START_TAG或END_TAG事件时的xml标签名。
XmlPullParser.getText:主要是用来获取文本内容。
XmlPullParser.next():将解析器移动到下一个事件上,这样可以把所有xml文件遍历完.
(从网上获取)实例代码:
package com.example.tf.androidpull.com.example.utils; import android.util.Xml; import com.example.tf.androidpull.com.example.domin.Person; import org.xmlpull.v1.XmlPullParser; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; /** * Created by TF on 2018/6/4. */ public class NetUtils { //将网络地址转化为输入流对象 public static InputStream getInputStreamByPath(String path) throws Exception { URL url = new URL(path); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setConnectTimeout(3000); int responseCode = httpURLConnection.getResponseCode(); if (responseCode == httpURLConnection.HTTP_OK) { return httpURLConnection.getInputStream(); } return null; } //将输入流转化为字节数组 public static byte[] getByteArrayByInputStream(InputStream inputStream) throws IOException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inputStream.read(buffer)) != -1) { byteArrayOutputStream.write(buffer, 0, len); } return byteArrayOutputStream.toByteArray(); } //降输入流转化为字符串 public static String getStringInputStream(InputStream inputStream) throws IOException { return new String(getByteArrayByInputStream(inputStream)); } //解析xml //START_DOCUMENT:表示xml开始解析。END_DOCUMENT:表示xml解析结束 public static List<Person> getPersonsByXmlString(String xml) throws Exception { List<Person> persons = new ArrayList<>(); //得到Pull解析器对象 XmlPullParser xmlPullParser = Xml.newPullParser(); //设置需要解析的Xml数据 xmlPullParser.setInput(new StringReader(xml)); //得到事件对象 int eventType = xmlPullParser.getEventType(); while(eventType!=XmlPullParser.END_DOCUMENT){ switch (eventType){ case XmlPullParser.START_DOCUMENT: System.out.println(); break; case XmlPullParser.START_TAG://开始标签 String startTag = xmlPullParser.getName(); System.out.println(); break; case XmlPullParser.TEXT://文本内容 String text = xmlPullParser.getText(); System.out.println(); break; case XmlPullParser.END_TAG://结束标签 String endTag = xmlPullParser.getName(); System.out.println(); break; } eventType = xmlPullParser.next(); } return persons; } }
(从本地获取)实例代码:
package com.hsj.example.pullparsedemo09; import android.content.res.AssetManager; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Xml; import org.xmlpull.v1.XmlPullParser; import java.io.InputStream; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //得到原生管理器对象 AssetManager assetManager=getAssets(); try { //调用原生管理器对象的open()方法传递需要读取的文件名,返回输入流对象 InputStream inputStream=assetManager.open("persons.xml"); //1.得到Xml解析器对象 XmlPullParser parser= Xml.newPullParser(); //2.指定解析器要解析的xml文件在哪里,这里以InputStream 的形式给予 parser.setInput(inputStream,"utf-8"); //3.得到事件类型 int eventType=parser.getEventType(); //XmlPullParser.START_DOCUMENT=0 System.out.println("eventType="+eventType); //只要没有解析完毕指定的xml 文件则继续解析 // XmlPullParser.END_DOCUMENT=1 while (eventType!=XmlPullParser.END_DOCUMENT){ switch (eventType){ //XmlPullParser.START_TAG=2:遇到开始标签时执行 case XmlPullParser.START_TAG: //得到当前解析到的标签的名字 String starTag=parser.getName(); if("person".equals(starTag)){ String id= parser.getAttributeValue(0); String isbn=parser.getAttributeName(1); System.out.println("id="+id+",isbn="+isbn); }else if("name".equals(starTag)){ //将事件流向后推进并返回解析到的内容 String name=parser.nextText(); System.out.println("name="+name); } System.out.println("startTag="+starTag); break; //XmlPullParser.TEXT=4:遇到文本节点时触发 /*case XmlPullParser.TEXT: //得到文本内容 String text= parser.getText(); System.out.println("text="+text); break;*/ case XmlPullParser.END_TAG: //得到解析的标签名 String endTag=parser.getName(); System.out.println("endTag="+endTag); break; } //将事件流继续向后推进 eventType=parser.next(); } } catch (Exception e) { e.printStackTrace(); } } }