java中xml的解析方式有许多,有java自带的DOM、SAX,android中的PULL,其它的还有DOM4J、JDOM等。

本文简要讲述DOM、SAX、PULL三种方式。

1.DOM方法

缺点:此方法会将所有数据都读取到内存中,内存消耗大,数据量太大容易造成OOM,而且此方法的效率较低,所以不建议在移动开发中使用。

优点:以树形的结构访问,容易理解,编码简单,可随机访问所需要的内容。

2.SAX方法:

从开头顺序读取直至结尾,读取和处理同步。

缺点:编码难度较大

优点:解析快,占用内存小,适合在移动设备上使用

3.PULL方法:

此方法与SAX方法类似,适合在移动设备中使用,android系统内部默认使用此方法。

与SAX的区别是,此方法能随时结束解析,而SAX不能。


先展示一下接下来要解析的xml数据和对应的类:

book.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <bookstore>
  3. <book id="1">
  4. <name>冰与火之歌</name>
  5. <author>乔治马丁</author>
  6. <year>2014</year>
  7. <price>89</price>
  8. </book>
  9. <book id="2">
  10. <name>安徒生童话</name>
  11. <year>2004</year>
  12. <price>77</price>
  13. <language>English</language>
  14. </book>
  15. </bookstore>

Book.java

  1. public class Book {
  2. private String id;
  3. private String name;
  4. private String author;
  5. private String year;
  6. private String price;
  7. private String language;
  8.  
  9. public String getId() {
  10. return id;
  11. }
  12.  
  13. public void setId(String id) {
  14. this.id = id;
  15. }
  16.  
  17. public String getName() {
  18. return name;
  19. }
  20.  
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24.  
  25. public String getAuthor() {
  26. return author;
  27. }
  28.  
  29. public void setAuthor(String author) {
  30. this.author = author;
  31. }
  32.  
  33. public String getYear() {
  34. return year;
  35. }
  36.  
  37. public void setYear(String year) {
  38. this.year = year;
  39. }
  40.  
  41. public String getPrice() {
  42. return price;
  43. }
  44.  
  45. public void setPrice(String price) {
  46. this.price = price;
  47. }
  48.  
  49. public String getLanguage() {
  50. return language;
  51. }
  52.  
  53. public void setLanguage(String language) {
  54. this.language = language;
  55. }
  56.  
  57. @Override
  58. public String toString() {
  59. return "Book{" +
  60. "id='" + id + '\'' +
  61. ", name='" + name + '\'' +
  62. ", author='" + author + '\'' +
  63. ", year='" + year + '\'' +
  64. ", price='" + price + '\'' +
  65. ", language='" + language + '\'' +
  66. '}';
  67. }
  68. }

1、PULL

解析:

  1. public static ArrayList<Book> getBooks(InputStream is) throws Exception {
  2. ArrayList<Book> books = null;
  3. Book book = null;
  4. // 创建一个xml解析的工厂
  5. XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
  6. // 获得xml解析类的引用
  7. XmlPullParser parser = factory.newPullParser();
  8. parser.setInput(is, "UTF-8");
  9. // 获得事件的类型
  10. int eventType = parser.getEventType();
  11. while (eventType != XmlPullParser.END_DOCUMENT) {
  12. switch (eventType) {
  13. case XmlPullParser.START_DOCUMENT:
  14. books = new ArrayList<>();
  15. break;
  16. case XmlPullParser.START_TAG:
  17. if ("book".equals(parser.getName())) {
  18. book = new Book();
  19. // 取出属性值
  20. String id = parser.getAttributeValue(0);
  21. book.setId(id);
  22. } else if ("name".equals(parser.getName())) {
  23. String name = parser.nextText();// 获取该节点的内容
  24. Show.log("name:"+name);
  25. book.setName(name);
  26. } else if ("author".equals(parser.getName())) {
  27. String author = parser.nextText();
  28. book.setAuthor(author);
  29. }else if("year".equals(parser.getName())){
  30. String year=parser.nextText();
  31. book.setYear(year);
  32. }else if ("price".equals(parser.getName())){
  33. String price=parser.nextText();
  34. book.setPrice(price);
  35. }else if("language".equals(parser.getName())){
  36. String language=parser.nextText();
  37. book.setLanguage(language);
  38. }
  39. break;
  40. case XmlPullParser.END_TAG:
  41. if ("book".equals(parser.getName())) {
  42. books.add(book);
  43. book = null;
  44. }
  45. break;
  46. }
  47. eventType = parser.next();
  48. }
  49. return books;
  50. }

生成:

  1. public static void save(List<Book> books, OutputStream out) throws Exception {
  2. XmlSerializer serializer = Xml.newSerializer();
  3. serializer.setOutput(out, "UTF-8");
  4. serializer.startDocument("UTF-8", true);
  5. serializer.startTag(null, "bookstore");
  6. for (Book book : books) {
  7. Show.log(book.toString());
  8. serializer.startTag(null, "book");
  9. serializer.attribute(null, "id", book.getId() + "");
  10.  
  11. serializer.startTag(null, "name");
  12. serializer.text(book.getName());
  13. serializer.endTag(null, "name");
  14.  
  15. serializer.startTag(null, "author");
  16. serializer.text(book.getAuthor() + "");
  17. serializer.endTag(null, "author");
  18.  
  19. serializer.startTag(null,"year");
  20. serializer.text(book.getYear());
  21. serializer.endTag(null,"year");
  22.  
  23. serializer.startTag(null,"language");
  24. serializer.text(book.getLanguage()+"");
  25. serializer.endTag(null,"language");
  26.  
  27. serializer.endTag(null, "book");
  28. }
  29.  
  30. serializer.endTag(null, "bookstore");
  31. serializer.endDocument();
  32. }

2、DOM

解析:

  1. public static void domXmlParser() {
  2. ArrayList<Book> bookLists = new ArrayList<Book>();
  3. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  4. try {
  5. DocumentBuilder db = dbf.newDocumentBuilder();
  6. Document document = db.parse("book.xml");
  7. NodeList bookList = document.getElementsByTagName("book");
  8. for (int i = 0; i < bookList.getLength(); i++) {
  9. Node book = bookList.item(i);
  10. Book bookEntity = new Book();
  11. NamedNodeMap attrs = book.getAttributes();
  12. for (int j = 0; j < attrs.getLength(); j++) {
  13. Node attr = attrs.item(j);
  14. if (attr.getNodeName().equals("id")) {
  15. bookEntity.setId(attr.getNodeValue());
  16. }
  17. }
  18. NodeList childNodes = book.getChildNodes();
  19. for (int k = 0; k < childNodes.getLength(); k++) {
  20. if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
  21. String name = childNodes.item(k).getNodeName();
  22. String value = childNodes.item(k).getFirstChild().getNodeValue();
  23. if (name.equals("name")) {
  24. bookEntity.setName(value);
  25. }
  26. else if (name.equals("author")) {
  27. bookEntity.setAuthor(value);
  28. }
  29. else if (name.equals("year")) {
  30. bookEntity.setYear(value);
  31. }
  32. else if (name.equals("price")) {
  33. bookEntity.setPrice(value);
  34. }
  35. else if (name.equals("language")) {
  36. bookEntity.setLanguage(value);
  37. }
  38. }
  39. }
  40. bookLists.add(bookEntity);
  41. bookEntity = null;
  42. }
  43. } catch (ParserConfigurationException e) {
  44. e.printStackTrace();
  45. } catch (SAXException e) {
  46. e.printStackTrace();
  47. } catch (IOException e) {
  48. e.printStackTrace();
  49. }
  50. }

生成:

  1. public void DOMCreateXML() {
  2. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  3. DocumentBuilder db = null;
  4. try {
  5. db = dbf.newDocumentBuilder();
  6. } catch (ParserConfigurationException e) {
  7. e.printStackTrace();
  8. }
  9. Document document = db.newDocument();
  10. document.setXmlStandalone(true);
  11. Element bookstore = document.createElement("bookStore");
  12. Element book = document.createElement("book");
  13. Element name = document.createElement("name");
  14. name.setTextContent("小王子");
  15. book.appendChild(name);
  16. book.setAttribute("id", "1");
  17. bookstore.appendChild(book);
  18. document.appendChild(bookstore);
  19. TransformerFactory tff = TransformerFactory.newInstance();
  20. try {
  21. Transformer tf = tff.newTransformer();
  22. tf.setOutputProperty(OutputKeys.INDENT, "yes");
  23. tf.transform(new DOMSource(document), new StreamResult(new File(
  24. "books1.xml")));
  25. } catch (TransformerConfigurationException e) {
  26. e.printStackTrace();
  27. } catch (TransformerException e) {
  28. e.printStackTrace();
  29. }
  30. }

3、SAX

解析:

  1. public class SAXParserHandler extends DefaultHandler {
  2. String value = null;
  3. Book book = null;
  4. private ArrayList<Book> bookList = new ArrayList<Book>();
  5. public ArrayList<Book> getBookList() {
  6. return bookList;
  7. }
  8.  
  9. int bookIndex = 0;
  10. /**
  11. * 用来标识解析开始
  12. */
  13. @Override
  14. public void startDocument() throws SAXException {
  15. super.startDocument();
  16. }
  17.  
  18. /**
  19. * 用来标识解析结束
  20. */
  21. @Override
  22. public void endDocument() throws SAXException {
  23. super.endDocument();
  24. }
  25.  
  26. /**
  27. * 解析xml元素
  28. */
  29. @Override
  30. public void startElement(String uri, String localName, String qName,
  31. Attributes attributes) throws SAXException {
  32. super.startElement(uri, localName, qName, attributes);
  33. if (qName.equals("book")) {
  34. bookIndex++;
  35. book = new Book();
  36. String value = attributes.getValue("id");
  37. int num = attributes.getLength();
  38. for(int i = 0; i < num; i++){
  39. if (attributes.getQName(i).equals("id")) {
  40. book.setId(attributes.getValue(i));
  41. }
  42. }
  43. }
  44. }
  45.  
  46. @Override
  47. public void endElement(String uri, String localName, String qName)
  48. throws SAXException {
  49. super.endElement(uri, localName, qName);
  50. if (qName.equals("book")) {
  51. bookList.add(book);
  52. book = null;
  53. }
  54. else if (qName.equals("name")) {
  55. book.setName(value);
  56. }
  57. else if (qName.equals("author")) {
  58. book.setAuthor(value);
  59. }
  60. else if (qName.equals("year")) {
  61. book.setYear(value);
  62. }
  63. else if (qName.equals("price")) {
  64. book.setPrice(value);
  65. }
  66. else if (qName.equals("language")) {
  67. book.setLanguage(value);
  68. }
  69. }
  70.  
  71. @Override
  72. public void characters(char[] ch, int start, int length)
  73. throws SAXException {
  74. // TODO Auto-generated method stub
  75. super.characters(ch, start, length);
  76. String temp = new String(ch, start, length);
  77. if (!temp.trim().equals("")) {
  78. value = temp;
  79. }
  80. }
  81. }
  1. public static void saxXmlParser(){
  2. SAXParserFactory factory = SAXParserFactory.newInstance();
  3. try {
  4. SAXParser parser = factory.newSAXParser();
  5. SAXParserHandler handler = new SAXParserHandler();
  6. parser.parse("book.xml", handler);
  7. } catch (ParserConfigurationException e) {
  8. e.printStackTrace();
  9. } catch (SAXException e) {
  10. e.printStackTrace();
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. }
  14. }

生成:

  1. public void SAXCreateXML() {
  2. SAXTransformerFactory tff = (SAXTransformerFactory) SAXTransformerFactory
  3. .newInstance();
  4. try {
  5. TransformerHandler handler = tff.newTransformerHandler();
  6. Transformer tr = handler.getTransformer();
  7. tr.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
  8. tr.setOutputProperty(OutputKeys.INDENT, "yes");
  9. File f = new File("books2.xml");
  10. if (!f.exists()) {
  11. f.createNewFile();
  12. }
  13. Result result = new StreamResult(new FileOutputStream(f));
  14. handler.setResult(result);
  15. handler.startDocument();
  16. AttributesImpl attr = new AttributesImpl();
  17. handler.startElement("", "", "bookstore", attr);
  18. attr.clear();
  19. attr.addAttribute("", "", "id", "", "1");
  20. handler.startElement("", "", "book", attr);
  21. attr.clear();
  22. handler.startElement("", "", "name", attr);
  23. handler.characters("小王子".toCharArray(), 0, "小王子".length());
  24. handler.endElement("", "", "name");
  25.  
  26. handler.endElement("", "", "book");
  27. handler.endElement("", "", "bookstore");
  28. handler.endDocument();
  29.  
  30. } catch (TransformerConfigurationException e) {
  31. e.printStackTrace();
  32. } catch (FileNotFoundException e) {
  33. e.printStackTrace();
  34. } catch (IOException e) {
  35. e.printStackTrace();
  36. } catch (SAXException e) {
  37. e.printStackTrace();
  38. }
  39. }

xml数据解析和生成的更多相关文章

  1. iOS - XML 数据解析

    前言 @interface NSXMLParser : NSObject public class NSXMLParser : NSObject 1.XML 数据 XML(Extensible Mar ...

  2. iOS开发——网络Swift篇&JSON与XML数据解析

    JSON与XML数据解析 JSON数据解析(内置NSJSONSerialization与第三方JSONKit)   一,使用自带的NSJSONSerialization 苹果从IOS5.0后推出了SD ...

  3. 关于C#对Xml数据解析

    首先进行简单说明Xml 与Html  和 XAML数据标签的差别. 1.Xml属于数据文本, 被设计为传输和存储数据,其焦点是数据的内容.它与json格式数据相似,可作为服务数据传输类型. 其中XML ...

  4. 二、Android XML数据解析

    XML,可扩展标记语言.可以用来存储数据,可以看做是一个小型的数据库,SharedPreference就是使用XML文件存储数据的,SQLite底层也是一个XML文件,而在网络应用方面,通常作为信息的 ...

  5. xml数据解析调研

    XML数据解析http://www.tuicool.com/articles/Nraau2(必用) http://www.cnblogs.com/pengyingh/articles/2342699. ...

  6. xml数据解析

    xml数据解析 在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.Kiss ...

  7. iOS开发网络篇之Web Service和XML数据解析

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下 ...

  8. Android XML数据解析

    XML:可扩展标记语言.一般用于数据存储,SharedPreference就是使用xml文件保存信息的,SQLite底层也是xml文件,在网络方面通常作为信息的载体,把数据包装成xml来传递. XML ...

  9. iOS-数据持久化基础-JSON与XML数据解析

    解析的基本概念 所谓“解析”:从事先规定好的格式串中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据.数据获取方按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 一.X ...

随机推荐

  1. Git详解和Github的使用

    Git和Github的概念: Git是分布式版本管理系统,简单说就是一个软件,用于记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的软件. Github是一个为用户提供Git服务的网站,简单说 ...

  2. python常见错误和异常

    1.BaseExeception 所有异常的基类 2.SystemEixt 解释器请求退出 3.KeyboardInterrupt 用户中断执行 4.Exception 常规错误的基类 5.StopI ...

  3. 采用React + Fabric + ImageMagick 实现大图片DIY定制

    一,需求背景: 某个印刷公司,有一系列的设计文件模板.接到客户订单时,就在这些设计文件模板上,做一些简单的定制,就能够满足客户的印刷需求. 如在设计文件模板上添加客户的Logo,二维码,联系方式等. ...

  4. P1060_开心的金明(JAVA语言)

    思路 0/1背包问题 模板 //暴力出奇迹 题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些 ...

  5. C++覆盖,隐藏,重载

    code[class*="language-"], pre[class*="language-"] { color: rgba(51, 51, 51, 1); ...

  6. sqli-labs系列——第一关

    先看了一遍关于sql的一些知识点,通关sqli-labs加深下印象.之前也因为作业的原因通关过前10关,但那时候不懂得原理,跟着网上的教程做的,所以这次尝试自己思考通关. less1 尝试and1=2 ...

  7. Maven项目中resources配置总结

    目录 背景 第一部分 基本配置介绍 第二部分 具体配置和注意事项 第三部分 读取resources资源 参考文献及资料 背景 通常Maven项目的文件目录结构如下: # Maven项目的标准目录结构 ...

  8. Java例题_27 100以内的素数

    1 /*27 [程序 27 求素数] 2 题目:求 100 之内的素数 3 */ 4 5 /*分析 6 * 素数:是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数. 7 * 同第二题: ...

  9. 简单了解Git

    目录 Git命令 如何将一个新建的文件添加到Git仓库 版本控制 本地的项目丢到Gitee上 代码修改以及推送步骤 分支管理 Git命令 ​ 1.git init创建git本地仓库 ​ 2.ls 查看 ...

  10. 一文带大家彻底搞懂Hystrix!

    前言? Netflix Hystrix断路器是什么? Netflix Hystrix是SOA/微服务架构中提供服务隔离.熔断.降级机制的工具/框架.Netflix Hystrix是断路器的一种实现,用 ...