xml数据解析和生成
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
- <?xml version="1.0" encoding="UTF-8"?>
- <bookstore>
- <book id="1">
- <name>冰与火之歌</name>
- <author>乔治马丁</author>
- <year>2014</year>
- <price>89</price>
- </book>
- <book id="2">
- <name>安徒生童话</name>
- <year>2004</year>
- <price>77</price>
- <language>English</language>
- </book>
- </bookstore>
Book.java
- public class Book {
- private String id;
- private String name;
- private String author;
- private String year;
- private String price;
- private String language;
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getAuthor() {
- return author;
- }
- public void setAuthor(String author) {
- this.author = author;
- }
- public String getYear() {
- return year;
- }
- public void setYear(String year) {
- this.year = year;
- }
- public String getPrice() {
- return price;
- }
- public void setPrice(String price) {
- this.price = price;
- }
- public String getLanguage() {
- return language;
- }
- public void setLanguage(String language) {
- this.language = language;
- }
- @Override
- public String toString() {
- return "Book{" +
- "id='" + id + '\'' +
- ", name='" + name + '\'' +
- ", author='" + author + '\'' +
- ", year='" + year + '\'' +
- ", price='" + price + '\'' +
- ", language='" + language + '\'' +
- '}';
- }
- }
1、PULL
解析:
- public static ArrayList<Book> getBooks(InputStream is) throws Exception {
- ArrayList<Book> books = null;
- Book book = null;
- // 创建一个xml解析的工厂
- XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
- // 获得xml解析类的引用
- XmlPullParser parser = factory.newPullParser();
- parser.setInput(is, "UTF-8");
- // 获得事件的类型
- int eventType = parser.getEventType();
- while (eventType != XmlPullParser.END_DOCUMENT) {
- switch (eventType) {
- case XmlPullParser.START_DOCUMENT:
- books = new ArrayList<>();
- break;
- case XmlPullParser.START_TAG:
- if ("book".equals(parser.getName())) {
- book = new Book();
- // 取出属性值
- String id = parser.getAttributeValue(0);
- book.setId(id);
- } else if ("name".equals(parser.getName())) {
- String name = parser.nextText();// 获取该节点的内容
- Show.log("name:"+name);
- book.setName(name);
- } else if ("author".equals(parser.getName())) {
- String author = parser.nextText();
- book.setAuthor(author);
- }else if("year".equals(parser.getName())){
- String year=parser.nextText();
- book.setYear(year);
- }else if ("price".equals(parser.getName())){
- String price=parser.nextText();
- book.setPrice(price);
- }else if("language".equals(parser.getName())){
- String language=parser.nextText();
- book.setLanguage(language);
- }
- break;
- case XmlPullParser.END_TAG:
- if ("book".equals(parser.getName())) {
- books.add(book);
- book = null;
- }
- break;
- }
- eventType = parser.next();
- }
- return books;
- }
生成:
- public static void save(List<Book> books, OutputStream out) throws Exception {
- XmlSerializer serializer = Xml.newSerializer();
- serializer.setOutput(out, "UTF-8");
- serializer.startDocument("UTF-8", true);
- serializer.startTag(null, "bookstore");
- for (Book book : books) {
- Show.log(book.toString());
- serializer.startTag(null, "book");
- serializer.attribute(null, "id", book.getId() + "");
- serializer.startTag(null, "name");
- serializer.text(book.getName());
- serializer.endTag(null, "name");
- serializer.startTag(null, "author");
- serializer.text(book.getAuthor() + "");
- serializer.endTag(null, "author");
- serializer.startTag(null,"year");
- serializer.text(book.getYear());
- serializer.endTag(null,"year");
- serializer.startTag(null,"language");
- serializer.text(book.getLanguage()+"");
- serializer.endTag(null,"language");
- serializer.endTag(null, "book");
- }
- serializer.endTag(null, "bookstore");
- serializer.endDocument();
- }
2、DOM
解析:
- public static void domXmlParser() {
- ArrayList<Book> bookLists = new ArrayList<Book>();
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- try {
- DocumentBuilder db = dbf.newDocumentBuilder();
- Document document = db.parse("book.xml");
- NodeList bookList = document.getElementsByTagName("book");
- for (int i = 0; i < bookList.getLength(); i++) {
- Node book = bookList.item(i);
- Book bookEntity = new Book();
- NamedNodeMap attrs = book.getAttributes();
- for (int j = 0; j < attrs.getLength(); j++) {
- Node attr = attrs.item(j);
- if (attr.getNodeName().equals("id")) {
- bookEntity.setId(attr.getNodeValue());
- }
- }
- NodeList childNodes = book.getChildNodes();
- for (int k = 0; k < childNodes.getLength(); k++) {
- if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
- String name = childNodes.item(k).getNodeName();
- String value = childNodes.item(k).getFirstChild().getNodeValue();
- if (name.equals("name")) {
- bookEntity.setName(value);
- }
- else if (name.equals("author")) {
- bookEntity.setAuthor(value);
- }
- else if (name.equals("year")) {
- bookEntity.setYear(value);
- }
- else if (name.equals("price")) {
- bookEntity.setPrice(value);
- }
- else if (name.equals("language")) {
- bookEntity.setLanguage(value);
- }
- }
- }
- bookLists.add(bookEntity);
- bookEntity = null;
- }
- } catch (ParserConfigurationException e) {
- e.printStackTrace();
- } catch (SAXException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
生成:
- public void DOMCreateXML() {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- DocumentBuilder db = null;
- try {
- db = dbf.newDocumentBuilder();
- } catch (ParserConfigurationException e) {
- e.printStackTrace();
- }
- Document document = db.newDocument();
- document.setXmlStandalone(true);
- Element bookstore = document.createElement("bookStore");
- Element book = document.createElement("book");
- Element name = document.createElement("name");
- name.setTextContent("小王子");
- book.appendChild(name);
- book.setAttribute("id", "1");
- bookstore.appendChild(book);
- document.appendChild(bookstore);
- TransformerFactory tff = TransformerFactory.newInstance();
- try {
- Transformer tf = tff.newTransformer();
- tf.setOutputProperty(OutputKeys.INDENT, "yes");
- tf.transform(new DOMSource(document), new StreamResult(new File(
- "books1.xml")));
- } catch (TransformerConfigurationException e) {
- e.printStackTrace();
- } catch (TransformerException e) {
- e.printStackTrace();
- }
- }
3、SAX
解析:
- public class SAXParserHandler extends DefaultHandler {
- String value = null;
- Book book = null;
- private ArrayList<Book> bookList = new ArrayList<Book>();
- public ArrayList<Book> getBookList() {
- return bookList;
- }
- int bookIndex = 0;
- /**
- * 用来标识解析开始
- */
- @Override
- public void startDocument() throws SAXException {
- super.startDocument();
- }
- /**
- * 用来标识解析结束
- */
- @Override
- public void endDocument() throws SAXException {
- super.endDocument();
- }
- /**
- * 解析xml元素
- */
- @Override
- public void startElement(String uri, String localName, String qName,
- Attributes attributes) throws SAXException {
- super.startElement(uri, localName, qName, attributes);
- if (qName.equals("book")) {
- bookIndex++;
- book = new Book();
- String value = attributes.getValue("id");
- int num = attributes.getLength();
- for(int i = 0; i < num; i++){
- if (attributes.getQName(i).equals("id")) {
- book.setId(attributes.getValue(i));
- }
- }
- }
- }
- @Override
- public void endElement(String uri, String localName, String qName)
- throws SAXException {
- super.endElement(uri, localName, qName);
- if (qName.equals("book")) {
- bookList.add(book);
- book = null;
- }
- else if (qName.equals("name")) {
- book.setName(value);
- }
- else if (qName.equals("author")) {
- book.setAuthor(value);
- }
- else if (qName.equals("year")) {
- book.setYear(value);
- }
- else if (qName.equals("price")) {
- book.setPrice(value);
- }
- else if (qName.equals("language")) {
- book.setLanguage(value);
- }
- }
- @Override
- public void characters(char[] ch, int start, int length)
- throws SAXException {
- // TODO Auto-generated method stub
- super.characters(ch, start, length);
- String temp = new String(ch, start, length);
- if (!temp.trim().equals("")) {
- value = temp;
- }
- }
- }
- public static void saxXmlParser(){
- SAXParserFactory factory = SAXParserFactory.newInstance();
- try {
- SAXParser parser = factory.newSAXParser();
- SAXParserHandler handler = new SAXParserHandler();
- parser.parse("book.xml", handler);
- } catch (ParserConfigurationException e) {
- e.printStackTrace();
- } catch (SAXException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
生成:
- public void SAXCreateXML() {
- SAXTransformerFactory tff = (SAXTransformerFactory) SAXTransformerFactory
- .newInstance();
- try {
- TransformerHandler handler = tff.newTransformerHandler();
- Transformer tr = handler.getTransformer();
- tr.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
- tr.setOutputProperty(OutputKeys.INDENT, "yes");
- File f = new File("books2.xml");
- if (!f.exists()) {
- f.createNewFile();
- }
- Result result = new StreamResult(new FileOutputStream(f));
- handler.setResult(result);
- handler.startDocument();
- AttributesImpl attr = new AttributesImpl();
- handler.startElement("", "", "bookstore", attr);
- attr.clear();
- attr.addAttribute("", "", "id", "", "1");
- handler.startElement("", "", "book", attr);
- attr.clear();
- handler.startElement("", "", "name", attr);
- handler.characters("小王子".toCharArray(), 0, "小王子".length());
- handler.endElement("", "", "name");
- handler.endElement("", "", "book");
- handler.endElement("", "", "bookstore");
- handler.endDocument();
- } catch (TransformerConfigurationException e) {
- e.printStackTrace();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (SAXException e) {
- e.printStackTrace();
- }
- }
xml数据解析和生成的更多相关文章
- iOS - XML 数据解析
前言 @interface NSXMLParser : NSObject public class NSXMLParser : NSObject 1.XML 数据 XML(Extensible Mar ...
- iOS开发——网络Swift篇&JSON与XML数据解析
JSON与XML数据解析 JSON数据解析(内置NSJSONSerialization与第三方JSONKit) 一,使用自带的NSJSONSerialization 苹果从IOS5.0后推出了SD ...
- 关于C#对Xml数据解析
首先进行简单说明Xml 与Html 和 XAML数据标签的差别. 1.Xml属于数据文本, 被设计为传输和存储数据,其焦点是数据的内容.它与json格式数据相似,可作为服务数据传输类型. 其中XML ...
- 二、Android XML数据解析
XML,可扩展标记语言.可以用来存储数据,可以看做是一个小型的数据库,SharedPreference就是使用XML文件存储数据的,SQLite底层也是一个XML文件,而在网络应用方面,通常作为信息的 ...
- xml数据解析调研
XML数据解析http://www.tuicool.com/articles/Nraau2(必用) http://www.cnblogs.com/pengyingh/articles/2342699. ...
- xml数据解析
xml数据解析 在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.Kiss ...
- iOS开发网络篇之Web Service和XML数据解析
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下 ...
- Android XML数据解析
XML:可扩展标记语言.一般用于数据存储,SharedPreference就是使用xml文件保存信息的,SQLite底层也是xml文件,在网络方面通常作为信息的载体,把数据包装成xml来传递. XML ...
- iOS-数据持久化基础-JSON与XML数据解析
解析的基本概念 所谓“解析”:从事先规定好的格式串中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据.数据获取方按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 一.X ...
随机推荐
- Git详解和Github的使用
Git和Github的概念: Git是分布式版本管理系统,简单说就是一个软件,用于记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的软件. Github是一个为用户提供Git服务的网站,简单说 ...
- python常见错误和异常
1.BaseExeception 所有异常的基类 2.SystemEixt 解释器请求退出 3.KeyboardInterrupt 用户中断执行 4.Exception 常规错误的基类 5.StopI ...
- 采用React + Fabric + ImageMagick 实现大图片DIY定制
一,需求背景: 某个印刷公司,有一系列的设计文件模板.接到客户订单时,就在这些设计文件模板上,做一些简单的定制,就能够满足客户的印刷需求. 如在设计文件模板上添加客户的Logo,二维码,联系方式等. ...
- P1060_开心的金明(JAVA语言)
思路 0/1背包问题 模板 //暴力出奇迹 题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些 ...
- C++覆盖,隐藏,重载
code[class*="language-"], pre[class*="language-"] { color: rgba(51, 51, 51, 1); ...
- sqli-labs系列——第一关
先看了一遍关于sql的一些知识点,通关sqli-labs加深下印象.之前也因为作业的原因通关过前10关,但那时候不懂得原理,跟着网上的教程做的,所以这次尝试自己思考通关. less1 尝试and1=2 ...
- Maven项目中resources配置总结
目录 背景 第一部分 基本配置介绍 第二部分 具体配置和注意事项 第三部分 读取resources资源 参考文献及资料 背景 通常Maven项目的文件目录结构如下: # Maven项目的标准目录结构 ...
- Java例题_27 100以内的素数
1 /*27 [程序 27 求素数] 2 题目:求 100 之内的素数 3 */ 4 5 /*分析 6 * 素数:是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数. 7 * 同第二题: ...
- 简单了解Git
目录 Git命令 如何将一个新建的文件添加到Git仓库 版本控制 本地的项目丢到Gitee上 代码修改以及推送步骤 分支管理 Git命令 1.git init创建git本地仓库 2.ls 查看 ...
- 一文带大家彻底搞懂Hystrix!
前言? Netflix Hystrix断路器是什么? Netflix Hystrix是SOA/微服务架构中提供服务隔离.熔断.降级机制的工具/框架.Netflix Hystrix是断路器的一种实现,用 ...