解析XML格式数据
来源:互联网 发布:seo软件工具 编辑:程序博客网 时间:2024/06/09 20:20
在网络上传输数据时最常用的格式有两种,XML和JSON,下面我们就来一个个地进行学习,本节首先学一下如何解析XML格式的数据。
1.assets文件夹下放books.xml,里面放需要解析的xml数据
<?xml version="1.0" encoding="utf-8"?> <books> <book> <id>1001</id> <name>Thinking In Java</name> <price>80.00</price> </book> <book> <id>1002</id> <name>Core Java</name> <price>90.00</price> </book> <book> <id>1003</id> <name>Hello, Andriod</name> <price>100.00</price> </book> </books>
2.Book实体类
public class Book { private int id; private String name; private float price; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } @Override public String toString() { return "Book [id=" + id + ", name=" + name + ", price=" + price + "]"; }}
3.定义一个接口
public interface BookParser { /** * 解析输入流 得到Book对象集合 * @param is * @return * @throws Exception */ public List<Book> parse(InputStream is) throws Exception; }
4.SAX解析
public class SAXParser implements BookParser { @Override public List<Book> parse(InputStream is) throws Exception { // TODO Auto-generated method stub SAXParserFactory factory = SAXParserFactory.newInstance(); // 取得SAXParserFactory实例 javax.xml.parsers.SAXParser parser = factory.newSAXParser(); // 从factory获取SAXParser实例 MyHandler handler = new MyHandler(); // 实例化自定义Handler parser.parse(is, handler); // 根据自定义Handler规则解析输入流 return handler.getBooks(); } // 需要重写DefaultHandler的方法 private class MyHandler extends DefaultHandler { private List<Book> books; private Book book; private StringBuilder builder; // 返回解析后得到的Book对象集合 public List<Book> getBooks() { return books; } /* * startDocument()方法会在开始XML解析的时候调用 */ @Override public void startDocument() throws SAXException { super.startDocument(); books = new ArrayList<Book>(); builder = new StringBuilder(); } /* * startElement()方法会在开始解析某个结点的时候调用 * 其中,startElement()、characters()和endElement()这三个方法是有参数的, * 从XML中解析出的数据就会以参数的形式传入到这些方法中。需要注意的是,在获取结点中的内容时, * characters()方法可能会被调用多次,一些换行符也被当作内容解析出来, * 我们需要针对这种情况在代码中做好控制。 */ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); if (localName.equals("book")) { book = new Book(); } builder.setLength(0); // 将字符长度设置为0 以便重新开始读取元素内的字符节点 } /* * characters()方法会在获取结点中内容的时候调用 */ public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); builder.append(ch, start, length); // 将读取的字符数组追加到builder中 } /* * endElement()方法会在完成解析某个结点的时候调用 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); if (localName.equals("id")) { book.setId(Integer.parseInt(builder.toString())); } else if (localName.equals("name")) { book.setName(builder.toString()); } else if (localName.equals("price")) { book.setPrice(Float.parseFloat(builder.toString())); } else if (localName.equals("book")) { books.add(book); } } /* *endDocument()方法会在完成整个XML解析的时候调用 */ @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); } }}
5.PULL解析
public class PullParser implements BookParser{ @Override public List<Book> parse(InputStream is) throws Exception { // TODO Auto-generated method stub List<Book> books=null; Book book=null; XmlPullParser parser=Xml.newPullParser();//由android.util.Xml创建一个XmlPullParser实例 parser.setInput(is, "utf-8"); //设置输入流 并指明编码方式 // parser.setInput(new StringReader("string")); //解析字符串 int eventType= parser.getEventType(); while(eventType!=XmlPullParser.END_DOCUMENT){ switch (eventType) { case XmlPullParser.START_DOCUMENT: books=new ArrayList<Book>(); break; //在一个while循环中不断地进行解析,如果当前的解析事件不等于XmlPullParser.END_DOCUMENT,说明解析工作还没完成,调用next()方法后可以获取下一个解析事件。 //在while循环中,我们通过getName()方法得到当前结点的名字,如果发现结点名等于id、name或version,就调用nextText()方法来获取结点内具体的内容 case XmlPullParser.START_TAG:// 开始解析某个结点 if(parser.getName().equals("book")){ book=new Book(); }else if(parser.getName().equals("id")){ //方法一: eventType=parser.next(); book.setId(Integer.parseInt(parser.getText())); }else if(parser.getName().equals("name")){ //方法二: book.setName(parser.nextText()); }else if(parser.getName().equals("price")){ eventType=parser.next(); book.setPrice(Float.parseFloat(parser.getText())); } break; case XmlPullParser.END_TAG:// 结束解析某个结点 if(parser.getName().equals("book")){ books.add(book); book=null; } break; } eventType=parser.next();//这句不能少,否则会一直解析 } return books; }}
6.DOM解析
public class DOMParser implements BookParser { @Override public List<Book> parse(InputStream is) throws Exception { // TODO Auto-generated method stub List<Book> books = new ArrayList<Book>(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 取得DocumentBuilderFactory实例 DocumentBuilder builder = factory.newDocumentBuilder(); // 从factory获取DocumentBuilder实例 Document doc = builder.parse(is); // 解析输入流 得到Document实例 Element rootElement = doc.getDocumentElement(); NodeList items = rootElement.getElementsByTagName("book"); for (int i = 0; i < items.getLength(); i++) { Book book = new Book(); Node item = items.item(i); NodeList properties = item.getChildNodes(); for (int j = 0; j < properties.getLength(); j++) { Node property = properties.item(j); String nodeName = property.getNodeName(); if (nodeName.equals("id")) { book.setId(Integer.parseInt(property.getFirstChild() .getNodeValue())); } else if (nodeName.equals("name")) { book.setName(property.getFirstChild().getNodeValue()); } else if (nodeName.equals("price")) { book.setPrice(Float.parseFloat(property.getFirstChild() .getNodeValue())); } } books.add(book); } return books; }}
7.Activity中调用各个解析方法,解析xml数据
public class MainActivity extends Activity implements OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.pull).setOnClickListener(this); findViewById(R.id.sax).setOnClickListener(this); findViewById(R.id.dom).setOnClickListener(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.pull: try { InputStream in= getAssets().open("books.xml"); PullParser parser=new PullParser(); try { List<Book> books=parser.parse(in); for(Book book:books){ Log.d("book",book.toString() ); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } break; case R.id.dom: InputStream inp=null; try { inp = getAssets().open("books.xml"); DOMParser parser=new DOMParser(); List<Book> books=parser.parse(inp); for(Book book:books){ Log.d("book", book.toString()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } break; case R.id.sax: InputStream ins=null; try { ins = getAssets().open("books.xml"); SAXParser parser=new SAXParser(); List<Book> books=parser.parse(ins); for(Book book:books){ Log.d("book", book.toString()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } break; default: break; } }}
0 0
- 解析XML格式数据
- 解析XML格式数据
- 解析XML格式数据
- 解析XML格式数据
- 解析XML格式数据
- xml格式数据解析
- 解析XML格式数据
- 解析 XML格式数据
- DOM解析XML格式数据
- Pull解析XML格式数据
- SAX解析XML格式数据
- android解析xml格式数据
- Android 解析XML格式数据
- 解析XML格式的数据
- Java解析xml格式数据
- 解析XML格式数据-Pull解析方式
- 解析XML格式数据--Pull解析
- Android解析数据—XML格式数据
- [LeetCode]Valid Anagram
- Android 核心分析 Service深入分析
- Xcode7发送HTTP请求的问题
- AngularJS体验式编程系列文章
- vs .sln与.suo文件
- 解析XML格式数据
- ZOJ.2818 Root of the Problem【开根号,水】 2015/09/22
- arduino 328P的BootLoader
- UITableView新增特性类似于qq(置顶--删除)
- dos命令复制当天生成的以日期为文件名的文件
- iOS开发CGD买票
- php 技术收藏
- 2. 包类结构、数据类型、变量与常量、运算符、注释与规范
- Java加密算法笔记