Luu 2020-04-14
最近在在XML解析,测试了DOM和XmlPullParse两种模式解析XML,记录下来!
首先,创建在Sdcard里创建Xml文件,然后,建立两个按钮分别使用DOM、XmlPullParse来解析Xml文件,并且分别显示在TextView中.
废话少说,先上效果图:
1 XmlPullParserFactory factory =XmlPullParserFactory.newInstance(); 2 XmlPullParser xmlPullParser =factory.newPullParser();
1 this.getClass().getClassLoader(); 2 xmlPullParser.setInput(ClassLoader.getSystemResourceAsStream(BOOKS_PATH),"UTF-8");
int eventType = parser.getEventType(); //返回的状态类型 if (eventType == XmlPullParser.START_DOCUMENT) //XML文档开始 if (eventType == XmlPullParser.START_TAG) //开始读取某个标签 if (eventType == XmlPullParser.END_TAG) //结束读取某个标签 //TEXT:Text内容 if (eventType == XmlPullParser.END_DOCUMENT) //XML文档结束
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/create_xml" android:layout_width="match_parent" android:layout_height="40dp" android:text="创建XML文件"/> <Button android:id="@+id/dom_xml" android:layout_width="match_parent" android:layout_height="40dp" android:text="DOM解析XML"/> <Button android:id="@+id/pull_xml" android:layout_width="match_parent" android:layout_height="40dp" android:text="XmlPullParse解析XML"/> <TextView android:id="@+id/dom_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/colorAccent" android:textSize="18dip"/> <TextView android:id="@+id/pull_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/colorPrimary" android:textSize="18dip"/> </LinearLayout>
package com.zwl.xmlparseproject; import android.app.Activity; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.util.Xml; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; import org.xmlpull.v1.XmlSerializer; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; public class MainActivity extends Activity implements View.OnClickListener { private static final String TAG = MainActivity.class.getSimpleName(); private static final String BOOKS_PATH ="/sdcard/books.xml"; //创建books.xml文件路径 private Button mCreateXml,mDomXml,mPullXml; private TextView mDemoText,mPullText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setupViews(); } private void setupViews() { mCreateXml =findViewById(R.id.create_xml); mDomXml =findViewById(R.id.dom_xml); mPullXml =findViewById(R.id.pull_xml); mDemoText =findViewById(R.id.dom_text); mPullText =findViewById(R.id.pull_text); mCreateXml.setOnClickListener(this); mDomXml.setOnClickListener(this); mPullXml.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.create_xml: Log.d(TAG,"create_xml"); createXml(); break; case R.id.dom_xml: Log.d(TAG,"dom_xml"); domParseXML(); break; case R.id.pull_xml: Log.d(TAG,"pull_xml"); xmlPullParseXML(); break; default: break; } } //xmlPullParse解析Xml private void xmlPullParseXML() { String res="本结果通过XmlPullParse解析:"+"\n"; try{ XmlPullParserFactory factory =XmlPullParserFactory.newInstance(); XmlPullParser xmlPullParser =factory.newPullParser(); this.getClass().getClassLoader(); xmlPullParser.setInput(ClassLoader.getSystemResourceAsStream(BOOKS_PATH),"UTF-8"); int eventType =xmlPullParser.getEventType(); try { while (eventType!=XmlPullParser.END_DOCUMENT){ String nodename =xmlPullParser.getName(); switch (eventType){ case XmlPullParser.START_TAG: if ("bookname".equals(nodename)){ res += "书名:"+xmlPullParser.nextText()+""; }else if ("bookauthor".equals(nodename)){ res +="作者:"+xmlPullParser.nextText()+"\n"; } break; default: break; } eventType =xmlPullParser.next(); } } catch (IOException e) { e.printStackTrace(); } } catch (XmlPullParserException e) { e.printStackTrace(); } mPullText.setText(res); Toast.makeText(MainActivity.this, "XmlPullParser解析成功", Toast.LENGTH_SHORT).show(); } //dom解析XML文件 private void domParseXML() { File file=new File(BOOKS_PATH); DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); DocumentBuilder db =null; try{ db =dbf.newDocumentBuilder(); } catch (ParserConfigurationException e) { e.printStackTrace(); } Document document =null; try{ document =db.parse(file); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } Element root =document.getDocumentElement(); NodeList books =root.getElementsByTagName("book"); String res ="本结果是通过dom解析的:"+"\n"; for (int i=0 ; i<books.getLength();i++){ Node book = books.item(i); Node bookname=((org.w3c.dom.Element) book).getElementsByTagName("bookname").item(0); Node bookauthor=((org.w3c.dom.Element) book).getElementsByTagName("bookauthor").item(0); res += "书名:"+bookname.getFirstChild().getNodeValue()+""+ "作者:"+bookauthor.getFirstChild().getNodeValue()+"\n"; } mDemoText.setText(res); Toast.makeText(MainActivity.this, "解析成功", Toast.LENGTH_SHORT).show(); } //创建XML文件 private void createXml() { File file =new File(BOOKS_PATH); try{ file.createNewFile(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(MainActivity.this, "exception in createnewfile() method", Toast.LENGTH_SHORT).show(); } FileOutputStream fileOutputStream = null; try { fileOutputStream =new FileOutputStream(file); } catch (FileNotFoundException e) { e.printStackTrace(); Toast.makeText(MainActivity.this, "can‘t create file fileoutputStream", Toast.LENGTH_SHORT).show(); } XmlSerializer serializer = Xml.newSerializer(); try { serializer.setOutput(fileOutputStream,"UTF-8"); serializer.startDocument(null,true); serializer.startTag(null,"books"); for (int i=0 ;i<3;i++){ serializer.startTag(null,"book"); serializer.startTag(null,"bookname"); serializer.text("Android测试"+i); serializer.endTag(null,"bookname"); serializer.startTag(null,"bookauthor"); serializer.text("xiaoshu"+i); serializer.endTag(null,"bookauthor"); serializer.endTag(null,"book"); } serializer.endTag(null,"books"); serializer.endDocument(); serializer.flush(); fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } Toast.makeText(MainActivity.this, "创建xml文件成功", Toast.LENGTH_SHORT).show(); } }
1 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> //内外置SD卡写权限
完毕,全部代码如上.