这篇文章不是完全原创,XML解析的部分参考了 liuhe688 的文章。文章地址:http://blog.csdn.net/liuhe688/article/details/6415593

这是一个几乎完整的过程。覆盖面也比较广。应用了AsyncTask, BaseAdapter, ListView, Dom, Sax, Pull等,这些也是开发应用中必不可少的部分。

效果图:

    

首先,做了些准备工作。down了一份xml数据放在本地服务器上

定义了一个model。

book.java

  1. package com.example.phonedemo.model;
  2.  
  3. public class Book {
  4. private int id;
  5. private String name;
  6. private float price;
  7.  
  8. public int getId() {
  9. return id;
  10. }
  11.  
  12. public void setId(int id) {
  13. this.id = id;
  14. }
  15.  
  16. public String getName() {
  17. return name;
  18. }
  19.  
  20. public void setName(String name) {
  21. this.name = name;
  22. }
  23.  
  24. public float getPrice() {
  25. return price;
  26. }
  27.  
  28. public void setPrice(float price) {
  29. this.price = price;
  30. }
  31.  
  32. }

1、客户端发起请求,

这是通过AsyncTask异步发起的请求。

AsyncTask 主要需要复写四个方法:

onProExecute():这个方法会在UI线程中调用 execute(..)之后立即执行,在开发中通常做一些初始化和加载UI显示的工作。

doInBackground(String... params):比较费时的操作,可以放在这里。网络请求等...

onProgressUpdate(Integer... values):通常,我们在耗时操作时候,比如download,会有一个百分比进度。在doInBackground()方法中调用

publishProgress()方法后,系统会调用此方法,更新进度信息。

onPostExecute(InputStream result):执行完毕以后调用的方法。

2、服务器端返回xml数据,

3、客户端解析数据,最终呈现出来

我用了三种解析方法,参照上述blog的地址。不过,在他得代码中稍有问题。ID是没有的。我在我的代码中改正了。

三种方式都是解析一个xml,所以写了一个接口文件。

BookParserImpl.java

  1. package com.example.phonedemo.util;
  2.  
  3. import java.io.InputStream;
  4. import java.util.List;
  5.  
  6. import com.example.phonedemo.model.Book;
  7.  
  8. public interface BookParserImpl {
  9. public List<Book> parse(InputStream is);
  10.  
  11. public String serialize(List<Book> books);
  12. }

然后,三种解析分别实现它即可。

Dom解析方式

优点:功能齐全,强大。缺点:因为需要完全加载文档,导致,比较耗资源。前辈说j2ee中用的较多。

我虽然也学Java,但是一直都与前台打交道。曾经学的东西,工作中不用,就全忘了。罪过,罪过...

  1. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  2. DocumentBuilder builder = factory.newDocumentBuilder();
  3. Document doc = builder.parser(InputStream input);

上述dom初始化解析实例的代码。

DomBookParser.java

  1. package com.example.phonedemo.util;
  2.  
  3. import java.io.InputStream;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6.  
  7. import javax.xml.parsers.DocumentBuilder;
  8. import javax.xml.parsers.DocumentBuilderFactory;
  9.  
  10. import org.w3c.dom.Document;
  11. import org.w3c.dom.NamedNodeMap;
  12. import org.w3c.dom.Node;
  13. import org.w3c.dom.NodeList;
  14.  
  15. import com.example.phonedemo.model.Book;
  16.  
  17. public class DomBookParser implements BookParserImpl {
  18.  
  19. @Override
  20. public List<Book> parse(InputStream is) {
  21. List<Book> list = new ArrayList<Book>();
  22. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  23. DocumentBuilder builder = null;
  24. Document doc = null;
  25. try {
  26. builder = factory.newDocumentBuilder();
  27. doc = builder.parse(is);
  28. NodeList itemList = doc.getDocumentElement().getElementsByTagName(
  29. "book");
  30. for (int i = 0; i < itemList.getLength(); i++) {
  31. Book book = new Book();
  32. Node node = itemList.item(i);
  33. NodeList child = node.getChildNodes();
  34. NamedNodeMap attr = node.getAttributes();
  35. book.setId(Integer.parseInt(attr.getNamedItem("id")
  36. .getNodeValue()));
  37. for (int j = 0; j < child.getLength(); j++) {
  38. Node childItem = child.item(j);
  39. String nodeName = childItem.getNodeName();
  40. if (nodeName.equals("name")) {
  41. book.setName(childItem.getFirstChild().getNodeValue());
  42. } else if (nodeName.equals("price")) {
  43. book.setPrice(Float.parseFloat(childItem
  44. .getFirstChild().getNodeValue()));
  45. }
  46. }
  47.  
  48. list.add(book);
  49. }
  50.  
  51. } catch (Exception e) {
  52. // TODO Auto-generated catch block
  53. e.printStackTrace();
  54. }
  55. return list;
  56. }
  57.  
  58. @Override
  59. public String serialize(List<Book> books) {
  60. // TODO Auto-generated method stub
  61. return null;
  62. }
  63. }

Sax解析方式

sax是事件驱动型的,比起dom来更加灵巧。也更加简单快速。

SaxBookParser.java

  1. package com.example.phonedemo.util;
  2.  
  3. import java.io.InputStream;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6.  
  7. import javax.xml.parsers.SAXParser;
  8. import javax.xml.parsers.SAXParserFactory;
  9.  
  10. import org.xml.sax.Attributes;
  11. import org.xml.sax.SAXException;
  12. import org.xml.sax.helpers.DefaultHandler;
  13.  
  14. import com.example.phonedemo.model.Book;
  15.  
  16. public class SaxBookParser implements BookParserImpl {
  17.  
  18. @Override
  19. public List<Book> parse(InputStream is) {
  20. // TODO Auto-generated method stub
  21. SAXParserFactory factory = SAXParserFactory.newInstance();
  22. MyHandler handler = null;
  23. try {
  24. SAXParser parser = factory.newSAXParser();
  25. handler = new MyHandler();
  26. parser.parse(is, handler);
  27. } catch (Exception e) {
  28. // TODO Auto-generated catch block
  29. e.printStackTrace();
  30. }
  31. return handler.getBooks();
  32. }
  33.  
  34. /**
  35. * <b>解析xml的辅助类</b><br />
  36. * <b>startDocument()</b> 当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。<br />
  37. * <b>endDocument()</b> 和上面的方法相对应,当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。 <br/>
  38. * <b>startElement(String namespaceURI, String localName, String qName,
  39. * Attributes atts)</b>当读到一个开始标签的时候,会触发这个方法。<br />
  40. * <b>endElement(String uri, String localName, String name)</b>
  41. * 这个方法和上面的方法相对应,在遇到结束标签的时候,调用这个方法。<br />
  42. * <b>characters(char[] ch, int start, int length)</b>
  43. * 这个方法用来处理在XML文件中读到的内容,第一个参数用于存放文件的内容,<br />
  44. * 后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容。
  45. *
  46. * @author qxj
  47. *
  48. */
  49. class MyHandler extends DefaultHandler {
  50.  
  51. private List<Book> books;
  52. private Book book;
  53. private StringBuilder builder;
  54.  
  55. public List<Book> getBooks() {
  56. return books;
  57. }
  58.  
  59. /**
  60. * 接收元素中字符数据的通知。
  61. *
  62. * @param ch
  63. * - 字符。
  64. * @param start
  65. * - 字符数组中的开始位置。
  66. * @param length
  67. * - 从字符数组中使用的字符数。
  68. */
  69. @Override
  70. public void characters(char[] ch, int start, int length)
  71. throws SAXException {
  72. // TODO Auto-generated method stub
  73. super.characters(ch, start, length);
  74. builder.append(ch, start, length);
  75. }
  76.  
  77. /**
  78. * 接收元素结束的通知
  79. *
  80. * @param uri
  81. * - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
  82. * @param localName
  83. * - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
  84. * @param qName
  85. * - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
  86. * @exception SAXException
  87. * - 任何 SAX 异常,可能包装另外的异常。
  88. */
  89. @Override
  90. public void endElement(String uri, String localName, String qName)
  91. throws SAXException {
  92. // TODO Auto-generated method stub
  93. super.endElement(uri, localName, qName);
  94. if (localName.equals("book")) {
  95. books.add(book);
  96. } else if (localName.equals("name")) {
  97. book.setName(builder.toString());
  98. } else if (localName.equals("price")) {
  99. book.setPrice(Float.parseFloat(builder.toString()));
  100. }
  101. }
  102.  
  103. /**
  104. * 接收文档的开始的通知
  105. *
  106. * @exception - SAXException - 任何 SAX 异常,可能包装另外的异常
  107. */
  108. @Override
  109. public void startDocument() throws SAXException {
  110. // TODO Auto-generated method stub
  111. super.startDocument();
  112. books = new ArrayList<Book>();
  113. builder = new StringBuilder();
  114. }
  115.  
  116. /**
  117. * 接收元素开始的通知。
  118. *
  119. * @param uri
  120. * - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
  121. * @param localName
  122. * - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
  123. * @param qName
  124. * - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
  125. * @param attributes
  126. * - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。
  127. * @exception SAXException
  128. * - 任何 SAX 异常,可能包装另外的异常
  129. */
  130. @Override
  131. public void startElement(String uri, String localName, String qName,
  132. Attributes attributes) throws SAXException {
  133. // TODO Auto-generated method stub
  134. super.startElement(uri, localName, qName, attributes);
  135. if (localName.equals("book")) {
  136. book = new Book();
  137. if (attributes != null) {
  138. book.setId(Integer.parseInt(attributes.getValue("id")));
  139. }
  140. }
  141. builder.setLength(0);
  142. }
  143.  
  144. }
  145.  
  146. @Override
  147. public String serialize(List<Book> books) {
  148. // TODO Auto-generated method stub
  149. return null;
  150. }
  151.  
  152. }

Pull解析方式

我最喜欢这种解析方式,它最轻巧,简便。android 用到了很多xml的文件,系统都是用pull来解析的。从这个层面中可以看出来。android建议使用这种解析方式。

PullBookParser.java

  1. package com.example.phonedemo.util;
  2.  
  3. import java.io.InputStream;
  4. import java.io.StringWriter;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7.  
  8. import org.xmlpull.v1.XmlPullParser;
  9. import org.xmlpull.v1.XmlSerializer;
  10.  
  11. import android.util.Xml;
  12.  
  13. import com.example.phonedemo.model.Book;
  14.  
  15. public class PullBookParser implements BookParserImpl {
  16.  
  17. @Override
  18. public List<Book> parse(InputStream is) {
  19. // TODO Auto-generated method stub
  20. List<Book> books = null;
  21. Book book = null;
  22.  
  23. XmlPullParser parser = Xml.newPullParser();
  24. try {
  25. parser.setInput(is, "UTF-8");
  26. int eventType = parser.getEventType();
  27. while (eventType != XmlPullParser.END_DOCUMENT) {
  28. switch (eventType) {
  29. case XmlPullParser.START_DOCUMENT:
  30. books = new ArrayList<Book>();
  31. break;
  32. case XmlPullParser.START_TAG:
  33. if (parser.getName().equals("book")) {
  34. book = new Book();
  35. book.setId(Integer.parseInt(parser.getAttributeValue(0)));
  36. } else if (parser.getName().equals("name")) {
  37. parser.next();
  38. book.setName(parser.getText());
  39. } else if (parser.getName().equals("price")) {
  40. parser.next();
  41. book.setPrice(Float.parseFloat(parser.getText()));
  42. }
  43. break;
  44. case XmlPullParser.END_TAG:
  45. if (parser.getName().endsWith("book")) {
  46. books.add(book);
  47. book = null;
  48. }
  49. break;
  50. }
  51. parser.next();
  52. eventType = parser.getEventType();
  53. }
  54. } catch (Exception e) {
  55. // TODO Auto-generated catch block
  56. e.printStackTrace();
  57. }
  58. return books;
  59. }
  60.  
  61. @Override
  62. public String serialize(List<Book> books) {
  63. // TODO Auto-generated method stub
  64. XmlSerializer serializer = Xml.newSerializer();
  65. StringWriter writer = new StringWriter();
  66. try {
  67. serializer.setOutput(writer);
  68. serializer.startDocument("UTF-8", true);
  69. serializer.startTag("", "books");
  70. for (Book book : books) {
  71. serializer.startTag("", "book");
  72. serializer.attribute("", "id", String.valueOf(book.getId()));
  73.  
  74. serializer.startTag("", "name");
  75. serializer.text(book.getName());
  76. serializer.endTag("", "name");
  77.  
  78. serializer.startTag("", "price");
  79. serializer.text(book.getPrice() + "");
  80. serializer.endTag("", "price");
  81. serializer.endTag("", "book");
  82. }
  83. serializer.endTag("", "books");
  84. serializer.endDocument();
  85. } catch (Exception e) {
  86. // TODO Auto-generated catch block
  87. e.printStackTrace();
  88. }
  89. System.out.println("doc: " + writer.toString());
  90. return writer.toString();
  91. }
  92. }

最后,附上Activity

  1. package com.example.phonedemo;
  2.  
  3. import java.io.InputStream;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6.  
  7. import org.apache.http.HttpEntity;
  8. import org.apache.http.HttpResponse;
  9. import org.apache.http.HttpStatus;
  10. import org.apache.http.client.HttpClient;
  11. import org.apache.http.client.methods.HttpGet;
  12. import org.apache.http.impl.client.DefaultHttpClient;
  13.  
  14. import android.app.Activity;
  15. import android.content.Context;
  16. import android.os.AsyncTask;
  17. import android.os.Bundle;
  18. import android.util.Log;
  19. import android.view.LayoutInflater;
  20. import android.view.View;
  21. import android.view.View.OnClickListener;
  22. import android.view.ViewGroup;
  23. import android.widget.BaseAdapter;
  24. import android.widget.Button;
  25. import android.widget.ListView;
  26. import android.widget.TextView;
  27. import android.widget.Toast;
  28.  
  29. import com.example.phonedemo.model.Book;
  30. import com.example.phonedemo.util.DomBookParser;
  31. import com.example.phonedemo.util.PullBookParser;
  32. import com.example.phonedemo.util.SaxBookParser;
  33.  
  34. public class XMLParserDemo extends Activity {
  35.  
  36. private static final String TAG = "XMLParserDemo";
  37.  
  38. private static final String PATH = "http://192.168.1.121:8080/wwwroot/android/book.html";
  39.  
  40. private List<Book> list = null;
  41. private Button dom = null;
  42. private Button sax = null;
  43. private Button pull = null;
  44. private Button clear = null;
  45. private TextView parser = null;
  46. private ListView listView = null;
  47.  
  48. /**
  49. * 异步请求数据
  50. *
  51. * @author qinxijuan
  52. *
  53. */
  54. private class MyAsyncTask extends AsyncTask<String, Integer, InputStream> {
  55.  
  56. // 表示当前使用哪一种解析方式,0:dom ; 1: sax; 2:pull
  57. private int flag = 0;
  58.  
  59. public MyAsyncTask(int flag) {
  60. this.flag = flag;
  61. }
  62.  
  63. @Override
  64. protected void onPostExecute(InputStream result) {
  65. if (result != null) {
  66. if (flag == 0) {
  67. domParserFromInputStream(result);
  68. } else if (flag == 1) {
  69. saxParserFromInputStream(result);
  70. } else if (flag == 2) {
  71. pullParserFromInputStream(result);
  72. }
  73. } else {
  74. Toast.makeText(XMLParserDemo.this, "数据获取失败!",
  75. Toast.LENGTH_SHORT).show();
  76. }
  77. }
  78.  
  79. @Override
  80. protected void onPreExecute() {
  81. Log.i(TAG, "onPreExecute() Loading ... ");
  82. }
  83.  
  84. @Override
  85. protected void onProgressUpdate(Integer... values) {
  86. // TODO Auto-generated method stub
  87. super.onProgressUpdate(values);
  88. }
  89.  
  90. @Override
  91. protected InputStream doInBackground(String... params) {
  92.  
  93. InputStream result = null;
  94. HttpClient client = new DefaultHttpClient();
  95. HttpGet get = new HttpGet(params[0]);
  96. HttpResponse response = null;
  97. try {
  98. response = client.execute(get);
  99. if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
  100. HttpEntity entity = response.getEntity();
  101. result = entity.getContent();
  102. }
  103. } catch (Exception e) {
  104. e.printStackTrace();
  105. }
  106.  
  107. return result;
  108. }
  109.  
  110. }
  111.  
  112. static class ViewHolder {
  113. TextView id;
  114. TextView name;
  115. TextView price;
  116. }
  117.  
  118. class MyBaseAdapter extends BaseAdapter {
  119.  
  120. private List<Book> list = null;
  121. private LayoutInflater ly = null;
  122.  
  123. public MyBaseAdapter(Context context, List<Book> list) {
  124. this.ly = LayoutInflater.from(context);
  125. this.list = list;
  126. }
  127.  
  128. @Override
  129. public int getCount() {
  130. // TODO Auto-generated method stub
  131. return this.list.size();
  132. }
  133.  
  134. @Override
  135. public Object getItem(int arg0) {
  136. // TODO Auto-generated method stub
  137. return null;
  138. }
  139.  
  140. @Override
  141. public long getItemId(int arg0) {
  142. // TODO Auto-generated method stub
  143. return 0;
  144. }
  145.  
  146. @Override
  147. public View getView(int position, View convertView, ViewGroup arg2) {
  148. ViewHolder viewHolder = null;
  149. if (convertView == null) {
  150. viewHolder = new ViewHolder();
  151. convertView = ly.inflate(R.layout.simpleitem, null);
  152. viewHolder.id = (TextView) convertView.findViewById(R.id.id);
  153. viewHolder.name = (TextView) convertView
  154. .findViewById(R.id.name);
  155. viewHolder.price = (TextView) convertView
  156. .findViewById(R.id.age);
  157. convertView.setTag(viewHolder);
  158. } else {
  159. viewHolder = (ViewHolder) convertView.getTag();
  160. }
  161. viewHolder.id.setText(String.valueOf(list.get(position).getId()));
  162. viewHolder.name.setText(list.get(position).getName());
  163. viewHolder.price.setText(String.valueOf(list.get(position)
  164. .getPrice()));
  165. return convertView;
  166. }
  167.  
  168. }
  169.  
  170. @Override
  171. protected void onCreate(Bundle savedInstanceState) {
  172. // TODO Auto-generated method stub
  173. super.onCreate(savedInstanceState);
  174. super.setContentView(R.layout.xml_parser_layout);
  175.  
  176. this.dom = (Button) super.findViewById(R.id.dom);
  177. this.sax = (Button) super.findViewById(R.id.sax);
  178. this.pull = (Button) super.findViewById(R.id.pull);
  179. this.clear = (Button) super.findViewById(R.id.clear);
  180. this.parser = (TextView) super.findViewById(R.id.parser);
  181. this.listView = (ListView) super.findViewById(R.id.list_view);
  182.  
  183. this.clear.setOnClickListener(new OnClickListener() {
  184.  
  185. @Override
  186. public void onClick(View v) {
  187. // TODO Auto-generated method stub
  188. list = new ArrayList<Book>();
  189. MyBaseAdapter adapter = new MyBaseAdapter(XMLParserDemo.this,
  190. list);
  191. listView.setAdapter(adapter);
  192. parser.setText("数据清除完毕");
  193. }
  194. });
  195.  
  196. this.dom.setOnClickListener(new OnClickListener() {
  197.  
  198. @Override
  199. public void onClick(View v) {
  200. // TODO Auto-generated method stub
  201. MyAsyncTask mTask = new MyAsyncTask(0);
  202. mTask.execute(PATH);
  203. parser.setText("使用dom方式解析");
  204. }
  205. });
  206.  
  207. this.sax.setOnClickListener(new OnClickListener() {
  208.  
  209. @Override
  210. public void onClick(View arg0) {
  211. // TODO Auto-generated method stub
  212. MyAsyncTask mTask = new MyAsyncTask(1);
  213. mTask.execute(PATH);
  214. parser.setText("使用sax方式解析");
  215. }
  216. });
  217.  
  218. this.pull.setOnClickListener(new OnClickListener() {
  219.  
  220. @Override
  221. public void onClick(View arg0) {
  222. // TODO Auto-generated method stub
  223. MyAsyncTask mTask = new MyAsyncTask(2);
  224. mTask.execute(PATH);
  225. parser.setText("使用pull方式解析");
  226. }
  227. });
  228. }
  229.  
  230. public void domParserFromInputStream(InputStream input) {
  231. list = new ArrayList<Book>();
  232. DomBookParser domParser = new DomBookParser();
  233. System.out.println("input: " + input.toString());
  234. list = domParser.parse(input);
  235. MyBaseAdapter adapter = new MyBaseAdapter(this, list);
  236. this.listView.setAdapter(adapter);
  237. }
  238.  
  239. public void saxParserFromInputStream(InputStream input) {
  240. list = new ArrayList<Book>();
  241. SaxBookParser saxParser = new SaxBookParser();
  242. list = saxParser.parse(input);
  243. MyBaseAdapter adapter = new MyBaseAdapter(this, list);
  244. this.listView.setAdapter(adapter);
  245. }
  246.  
  247. public void pullParserFromInputStream(InputStream input) {
  248. PullBookParser pullParser = new PullBookParser();
  249. list = pullParser.parse(input);
  250. MyBaseAdapter adapter = new MyBaseAdapter(this, list);
  251. this.listView.setAdapter(adapter);
  252. }
  253.  
  254. }

xml_parser_layout.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6.  
  7. <LinearLayout
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:orientation="horizontal" >
  11.  
  12. <Button
  13. android:id="@+id/dom"
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. android:layout_weight="1"
  17. android:text="Dom" />
  18.  
  19. <Button
  20. android:id="@+id/sax"
  21. android:layout_width="fill_parent"
  22. android:layout_height="wrap_content"
  23. android:layout_weight="1"
  24. android:text="Sax" />
  25.  
  26. <Button
  27. android:id="@+id/pull"
  28. android:layout_width="fill_parent"
  29. android:layout_height="wrap_content"
  30. android:layout_weight="1"
  31. android:text="pull" />
  32.  
  33. <Button
  34. android:id="@+id/clear"
  35. android:layout_width="fill_parent"
  36. android:layout_height="wrap_content"
  37. android:layout_weight="1"
  38. android:text="clear" />
  39. </LinearLayout>
  40.  
  41. <LinearLayout
  42. android:layout_width="fill_parent"
  43. android:layout_height="wrap_content" >
  44.  
  45. <TextView
  46. android:id="@+id/parser"
  47. android:layout_width="fill_parent"
  48. android:layout_height="wrap_content"
  49. android:text=" " />
  50. </LinearLayout>
  51.  
  52. <LinearLayout
  53. android:layout_width="fill_parent"
  54. android:layout_height="wrap_content" >
  55.  
  56. <ListView
  57. android:id="@+id/list_view"
  58. android:layout_width="fill_parent"
  59. android:layout_height="wrap_content" >
  60. </ListView>
  61. </LinearLayout>
  62.  
  63. </LinearLayout>

Android 通过Dom, Sax, Pull解析网络xml数据的更多相关文章

  1. - XML 解析 总结 DOM SAX PULL MD

    目录 目录 XML 解析 总结 DOM SAX PULL MD 几种解析方式简介 要解析的内容 DOM 解析 代码 输出 SAX 解析 代码 输出 JDOM 解析 代码 输出 DOM4J 解析 代码 ...

  2. Android开发8——利用pull解析器读写XML文件

    一.基本介绍 对XML解析有SAX和DOM等多种方式,Android中极力推荐xmlpull方式解析xml.xmlpull不仅可用在Android上同样也适用于javase,但在javase环境中需自 ...

  3. [Swift通天遁地]四、网络和线程-(5)解析网络请求数据:String(字符串)、Data(二进制数据)和JSON数据

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  4. Android SAX、DOM、Pull解析xml文件剖析与案例讲解

    XML介绍 XML(Extensible Markup Language) 即可扩展标记语言,与HTML一样,都是SGML(Standard Generalized Markup Language,标 ...

  5. Android学习笔记_7_使用 sax 或者 dom 或者 pull 解析XML文件

    一.Pull解析介绍: Android上使用SAX和DOM方式解析XML的方法,并且对两种做了简单的比较,通过比较我们知道对在往往内存比较稀缺的移动设备上运行的Android系统来说,SAX是一种比较 ...

  6. Java sax、dom、pull解析xml

    -------------------------------------SAX解析xml---------------------------------- >Sax定义 SAX是一个解析速度 ...

  7. 解析XML:DOM,SAX,PULL

    Android解析XML有三种方式:DOM(document object model).SAX(simple api XML).PULL 1.DOM DOM解析XML文件时,会将XML文件的所有内容 ...

  8. 黎活明8天快速掌握android视频教程--15_采用Pull解析器解析和生成XML内容

    1.该项目主要有下面的两个作用 (1)将xml文件解析成对象的List对象,xml文件可以来自手机本地,也可以来自服务器返回的xml数据 (2)强list对象保存成xml文件,xml保存到手机的内存卡 ...

  9. SAX PULL解析实例

    XML三种解析方式: SAX解析:基于事件驱动,事件机制基于回调函数的,得到节点和节点之间内容时也会回调事件 PULL解析:相同基于事件驱动,仅仅只是回调时是常量 DOM解析:是先把XML文件装入内存 ...

随机推荐

  1. C++_前置声明

    为什么要有前置声明? eg: -定义一个类 class A,这个类里面使用了类B的对象b,然后定义了一个类B,里面也包含了一个类A的对象a,就成了这样: //a.h #include "b. ...

  2. 关于Python网络爬虫实战笔记③

    Python网络爬虫实战笔记③如何下载韩寒博客文章 Python网络爬虫实战笔记③如何下载韩寒博客文章 target:下载全部的文章 1. 博客列表页面规则 也就是, http://blog.sina ...

  3. idea修改文件名后出现main method should be static错误

    1.确保你有main方法 2.别忘了main方法里还有参数: String[] args

  4. ortoiseSVN无法编辑日志信息的解决方法

    提交时忘记编写日志,想重新编辑日志信息,弹出错误提示: DAV 请求失败:可能是版本库的 pre-revprop-change 钩子执行失败或者不存在 至少有一个属性变更失败:版本库未改变 设置属性  ...

  5. SeaJS 简单试用

    http://seajs.org/docs/#quick-start 感觉seajs的语法有点罗嗦... 它既有RequireJS的特点也有NodeJS引入模块的特点 例子是抄的官方的例子  在官方的 ...

  6. hdu 4034 Graph(逆向floyd)

    floyd的松弛部分是 g[i][j] = min(g[i][j], g[i][k] + g[k][j]);也就是说,g[i][j] <= g[i][k] + g[k][j] (存在i-> ...

  7. Sunday字符串匹配算法

    逛ACM神犇的博客的时候看到的这个神奇的算法 KMP吧,失配函数难理解,代码量长 BF吧,慢,很慢,特别慢. BM吧,我不会写... 现在看到了Sunday算法呀,眼前一亮,神清气爽啊. 字符串匹配算 ...

  8. PHP批量下载方法

      PHP批量下载方法 界面: $.get(“< ?php echo url::base(true);?>inventory/report/buildCsv”, //后台路径 {‘para ...

  9. EGit with eclipse to clone project from GitHub(Step by step)

    转载请注明出处! 1. To find your project URL inside GitHub: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWF ...

  10. Duanxx的图像处理学习: 透视变换(一)

    当人用眼睛看事物的时候,会感觉到近处的东西是比远处的东西要大一些的,通俗的说,这就是透视. 总的来说.透视变换是将3D的世界转换到2D图像上的一种手段,人的视觉系统和摄像头视觉系统也是基于这一工作原理 ...