选择解析方式
XML 的解析与生成有很多方式(SAX、Pull、Dom),其中 Pull 是 android 系统解析 XML 的一种方式,所以本文采用的是 Pull 的方式解析和生成Xml。
解析
XmlPullParser 的核心方法
-
setInput(InputStream inputStream, String inputEncoding)
设置解析器要处理的输入流
-
getEventType()
返回当前事件的类型事件类型有
-
START_DOCUMENT
指出分析器处于文档的开头,并且还没有读取任何内容。
-
END_DOCUMENT
xml文档的结尾
-
START_TAG
开始读取标签
-
END_TAG
读取到标签的结尾
-
TEXT
字符数据被读取时
-
-
next()
获取下一个解析事件
-
getName()
对于
START_TAG
和END_TAG
当前方法会返回读取当前元素的元素名 -
getAttributeCount()
返回当前开始标记的属性数量,如果当前事件类型不是START_TAG,则返回-1
-
getAttributeName(int index)
返回属性名称,超出范围会抛出IndexOutOfBoundsException
-
getAttributeValue(int index)
-
返回属性的值,超出范围会抛出IndexOutOfBoundsException
-
getText()
以String形式返回当前事件的文本内容
解析XML
-
获取 XmlPullParser 实例
-
第一种方式:
XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser parser = factory.newPullParser(); 复制代码
-
第二种方式:
XmlPullParser parser = Xml.newPullParser(); 复制代码
-
-
设置需要解析的 Xml 流
String xmlString = ""; InputStream is = new ByteArrayInputStream(xmlString.getBytes("UTF-8")); parser.setInput(is, "UTF-8"); 复制代码
-
处理事件直到读取到事件类型为 END_DOCUMENT
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 的核心方法
-
setOutput(OutputStream os, String encoding)
-
startDocument(String encoding, Boolean standalone)
-
startTag(String namespace, String name)
-
endTag(String nendamespace, String name)
-
attribute(String namespace, String name, String value)
-
text(String text)
-
endDocument()
生成XML
-
获取 XmlSerializer 实例
XmlSerializer serializer = Xml.newSerializer(); 复制代码
-
设置输出流
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); serializer.setOutput(outputStream, "UTF-8"); 复制代码
-
设置 Xml 文本
serializer.startDocument("UTF-8", true);//设置文本开始 serializer.startTag(null, "students");//设置开始标签 serializer.endTag(null, "age");//设置结束标签 serializer.attribute(null, "type", "number");//设置标签属性 serializer.text("18");//设置标签文本 复制代码
完整代码
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"\n" +
"<students>\n" +//开始标签
" <student>\n" +//开始标签
" <name area=\"china\">qin</name>\n" +//前一个name为开始标签,后一个name为结束标签, area 为 attribute 的 name,china 为 attribute 的 value
" <age type=\"number\">18</age>\n" +
" </student>\n" +
" <student>\n" +
" <name area=\"china\">qin</name>\n" +
" <age type=\"number\">18</age>\n" +
" </student>\n" +
" <student>\n" +
" <name area=\"china\">qin</name>\n" +
" <age type=\"number\">18</age>\n" +
" </student>\n" +
"</students>\n";
/**
* 生成xml
*/
private String generateXml() {
try {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(outputStream, "UTF-8");
serializer.startDocument("UTF-8", true);
serializer.startTag(null, "students");
for (int i = 0; i < 3; i++) {
serializer.startTag(null, "student");
serializer.startTag(null, "name");
serializer.attribute(null, "area", "china");
serializer.text("qin");
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.attribute(null, "type", "number");
serializer.text("18");
serializer.endTag(null, "age");
serializer.endTag(null, "student");
}
serializer.endTag(null, "students");
serializer.endDocument();
out.flush();
out.close();
return outputStream.toString();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 解析xml
*/
private void parseXml() {
List<Student> students = null;
Student student = null;
try {
InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8"));
XmlPullParser parser = Xml.newPullParser();
parser.setInput(is, "UTF-8");
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
students = new ArrayList<>();
break;
case XmlPullParser.START_TAG:
if ("student".equals(parser.getName())) {
student = new Student();
} else if ("name".equals(parser.getName())) {
if (student == null) {
return;
}
student.setName(parser.nextText());
} else if ("age".equals(parser.getName())) {
if (student == null) {
return;
}
student.setSex(Integer.parseInt(parser.nextText()));
}
break;
case XmlPullParser.END_TAG:
if ("student".equals(parser.getName())) {
if (students == null) {
return;
}
if (student == null) {
return;
}
students.add(student);
student = null;
}
break;
}
eventType = parser.next();
}
Log.d(TAG, "parseXml: " + students);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
复制代码
参考
http://www.runoob.com/w3cnote/android-tutorial-xml.html