由于现在一般都是使用 json
进行数据传递了,很少用到 xml
格式的,所以,突然遇到,感觉特TM费劲。
痛定思痛,决定记录一下,以免下次抓瞎。
**大神镇楼: ** 【Android】PULL解析XML文件
【其实里面的示例代码有错误。】
我来:
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Locale;
public class XmlParseDemo {
public static void main(String[] args) {
// parse1();
parseMsg();
}
private static void parseMsg(){
XmlPullParserFactory factory;
try {
// 1. get parser
factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser parser = factory.newPullParser();
FileInputStream in = new FileInputStream("big.xml");
InputStreamReader reader = new InputStreamReader(in, StandardCharsets.UTF_8);
parser.setInput(reader);
//2. do parse
int eventCode = parser.getEventType();//获取事件类型
int pos = 0;
while (true) {
if (eventCode == XmlPullParser.END_DOCUMENT) {
System.err.println("last -> " + info(pos, eventCode, parser.getName()));
break;
}
System.err.println(info(pos, eventCode, parser.getName()));
switch (eventCode) {
case XmlPullParser.START_DOCUMENT: //开始读取XML文档
//实例化集合类
break;
case XmlPullParser.START_TAG://开始读取某个标签
if ("person".equals(parser.getName())) {
//通过getName判断读到哪个标签,然后通过nextText()获取文本节点值,或通过getAttributeValue(i)获取属性节点值
}
break;
case XmlPullParser.END_TAG:
break;
}
eventCode = parser.next();
pos++;
}
System.err.println("finish parse of xml ###");
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void parse1() {
XmlPullParserFactory factory;
try {
// 1. get parser
factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser parser = factory.newPullParser();
FileInputStream in = new FileInputStream("big.xml");
InputStreamReader reader = new InputStreamReader(in, StandardCharsets.UTF_8);
parser.setInput(reader);
//2. do parse
int eventCode = parser.getEventType();//获取事件类型
int pos = 0;
while (true) {
if (eventCode == XmlPullParser.END_DOCUMENT) {
System.err.println("last -> " + info(pos, eventCode, parser.getName()));
break;
}
System.err.println(info(pos, eventCode, parser.getName()));
switch (eventCode) {
case XmlPullParser.START_DOCUMENT: //开始读取XML文档
break;
case XmlPullParser.START_TAG://开始读取某个标签
break;
case XmlPullParser.END_TAG://
break;
}
eventCode = parser.next();
pos++;
}
System.err.println("finish parse of xml ###");
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static String info(Object... args) {
return String.format(Locale.getDefault(),
"line={%d},evenType={%d},name=%s", args[0], args[1], args[2]);
}
}
这个
jar
还挺不好找到的,网上找半天。
主要步骤就是:
- 获取
parser
对象 - 将
parser
绑定到指定的xml
文件上面。 - 循环遍历,跳出循环的条件是
eventCode == XmlPullParser.END_DOCUMENT
(xml 读取结束了) - 根据不同的类型做对应的逻辑。一般而言,就
XmlPullParser.START_TAG
andXmlPullParser.TEXT
有用。START_TAG
:可以获取到里面属性;TEXT
:可以获取到里面的文本内容。
比如:
<person id="23">
<name>孙洋洋</name>
<age>30</age>
</person>
这里的 id="23"
是在 START_TAG
里面去获取的,parser.getName()
获取到 tag 的名称。对应这里就是 "person"
这里的 30
就属于 TEXT
,通过 parser.getText()
可以获取到。
对于这里的 name, age
值的获取,还是链接里面给的方式可取
String name = parser.getName();
if (name.equalsIgnoreCase("name")) {
currentPerson.setName(parser.nextText());// 如果后面是Text元素,即返回它的值
} else if (name.equalsIgnoreCase("age")) {
currentPerson.setAge(new Short(parser.nextText()));
}
---------------------
作者:云涛连雾
来源:优快云
原文:https://blog.youkuaiyun.com/jueblog/article/details/13164349
版权声明:本文为博主原创文章,转载请附上博文链接!
以上~