// 初始化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();
}
// 获取写入对象
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();
// 获取工厂对象
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);
}
}
//创建工厂对象
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");
// 开始一个id元素
ch = two_tab.toCharArray();
handler.characters(ch, 0, ch.length);
handler.startElement(uri, localName, "id", null);
ch = String.valueOf(book.getId()).toCharArray();
handler.characters(ch, 0, ch.length);
handler.endElement(uri, localName, "id");
//开始一个price元素 没有属性
ch = two_tab.toCharArray();
handler.characters(ch, 0, ch.length);
handler.startElement(uri, localName, "price", null);
ch = String.valueOf(book.getPrice()).toCharArray();
handler.characters(ch, 0, ch.length);
handler.endElement(uri, localName, "price");
// book的结束
ch = tab.toCharArray();
handler.characters(ch, 0, ch.length);
handler.endElement(uri, localName, "book");
}
handler.endElement(uri, localName, "books");
handler.endDocument();
在Android中不常用,这里不进行Demo举例,如果想研究 自行研究Demo。