# android-XmlParser **Repository Path**: yuhaiyang/xmlparser ## Basic Information - **Project Name**: android-XmlParser - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2017-05-09 - **Last Updated**: 2021-01-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #XmlParser ##MeTools 依赖库下载: - https://coding.net/u/yuhaiyang/p/MeTools/git ## 一. Pull解析和生成Xml ###a. Pull解析Xml ####主要流程: - 1.获取解析对象 - 2.设置属性 - 3.通过循环解析 ####具体代码: ``` java // 初始化Pull解析对象 XmlPullParser parser = Xml.newPullParser(); parser.setInput(input, "UTF-8"); // 获取第一个标签对象 int eventType = parser.getEventType(); /** * 流程: * 1. XmlPullParser.START_DOCUMENT 开始 * 2. XmlPullParser.START_TAG 标签开始 * 3. XmlPullParser.END_TAG 标签结束 * 4. XmlPullParser.END_DOCUMENT 结束 * * 流程1,4 只会走一次, 2 和 3 有几个标签 就会循环几次 */ while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT: break; case XmlPullParser.START_TAG: break; case XmlPullParser.END_TAG: break; } // 获取下一个标签 eventType = parser.next(); } ``` ### b. Pull生成XML ####主要流程: - 1.获取写入对象 - 2.设置属性 - 3.循环写入 ####具体代码: ```java // 获取写入对象 XmlSerializer serializer = Xml.newSerializer(); // 添加Wirter和配置属性 StringWriter writer = new StringWriter(); //设置输出方向为writer serializer.setOutput(writer); // 开始写入标头 serializer.startDocument("UTF-8", true); changeLine(serializer); serializer.startTag("", "books"); /** * a. 博客里面就简单的写入一个不一一列举 * b. changeLine 是一个换行的方法可忽略 * 添加方法: * 1. startTag 设置tag * 2. text 设置 tag对应的内容 * 3. endTag 结束tag */ for (Book book : books) { changeLine(serializer); serializer.startTag("", "name"); serializer.text(book.getName()); serializer.endTag("", "name"); } serializer.endTag("", "books"); serializer.endDocument(); ``` ## 二. Sax解析和生成xml ###a. Sax解析Xml ####主要流程: - 1.创建工厂对象 - 2.通过工厂来生成解析器 - 3.实例化 DefaultHandler (解析内容都会输出到Handle内) - 4.开始解析 ####具体代码: ```java // 获取工厂对象 SAXParserFactory factory = SAXParserFactory.newInstance(); // 通过工厂来生成解析器 SAXParser parser = factory.newSAXParser(); // 实例化 DefaultHandler SaxParserHandler handler = new SaxParserHandler(); // 开始解析 parser.parse(is, handler); /** Handler 的调用流程 * 1. startDocument * 2. startElement 开始解析 * 3. characters 当前行解析的结果 * 4. endElement 只有遇到才会调用到 */ private class SaxParserHandler extends DefaultHandler { // 开始解析 可以在这个里面初始化对象 @Override public void startDocument() throws SAXException { } // 开始解析标签 /** * localName 和 name 对应的是 标签的名字, * attr里面包含的是属性 */ @Override public void startElement(String uri, String localName, String name, Attributes attr) throws SAXException { super.startElement(uri, localName, name, attr); } // 当前标签解析出来的内容 /** * ch 是当前标签解析出来的内容, 可以赋值了. */ @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); } // 当遇到时候解析当前标签完毕 @Override public void endElement(String uri, String localName, String name) throws SAXException { super.endElement(uri, localName, name); } } ``` ###b. Sax生成Xml ####主要流程: - 1.创建工厂对象 - 2.通过工厂生成 对象 - 3.设定相关参数 - 4.循环添加 ####具体代码: ```java //创建工厂对象 SAXTransformerFactory factory = (SAXTransformerFactory)TransformerFactory.newInstance(); //通过工厂生成 对象 TransformerHandler handler = factory.newTransformerHandler(); // Transformer 设定参数 编码方式等 Transformer transformer = handler.getTransformer(); // 设置输出采用的编码方式 transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); // 是否自动添加额外的空白 transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // 是否忽略XML声明 transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); StringWriter writer = new StringWriter(); Result result = new StreamResult(writer); handler.setResult(result); //代表命名空间的URI 当URI无值时 须置为空字符串 String uri = ""; //命名空间的本地名称(不包含前缀) 当没有进行命名空间处理时 须置为空字符串 String localName = ""; // 缩进 String tab = "\n "; String two_tab = "\n "; char[] ch = null; // 开始写入 handler.startDocument(); // 这里需要考虑写入换行 ch = HaiYangUtils.NEW_LINE.toCharArray(); handler.characters(ch, 0, ch.length); // 写入books标签 handler.startElement(uri, localName, "books", null); //负责存放元素的属性信息 AttributesImpl attrs = new AttributesImpl(); /** * 循环写入每一个标签 * 写入流程: * 1. startElement * 2. characters * 3. endElement * 和解析的流程是一样的! */ for (Book book : books) { //清空属性列表 attrs.clear(); //添加一个名为id的属性(type影响不大,这里设为string // 例如: //attrs.addAttribute(uri, localName, "id", "string", String.valueOf(book.getId())); // 插入换行 ch = tab.toCharArray(); handler.characters(ch, 0, ch.length); //开始一个book元素 关联上面设定的id属性 handler.startElement(uri, localName, "book", attrs); //开始一个name元素 没有属性 ch = two_tab.toCharArray(); handler.characters(ch, 0, ch.length); handler.startElement(uri, localName, "name", null); ch = String.valueOf(book.getName()).toCharArray(); handler.characters(ch, 0, ch.length); handler.endElement(uri, localName, "name"); handler.endElement(uri, localName, "book"); } handler.endElement(uri, localName, "books"); handler.endDocument(); ``` ## 三. Dom解析和生成xml 在Android中不常用,这里不进行Demo举例,如果想研究 自行研究Demo