pull解析xml
Pull解析XML:
和sax类似,也是基于事件驱动的解析xml,但是比sax使用更方便简单;android也自己封装了pull的解析器XmlResourceParser;
常用的XML pull的接口和类:
XmlPullParser:该解析器是一个在org.xmlpull.v1中定义的解析功能的接口。
XmlSerializer:它是一个接口,定义了XML信息集的序列。
XmlPullParserFactory:这个类用于在XMPULL V1 API中创建XML Pull解析器。
XmlPullParserException:抛出单一的XML pull解析器相关的错误。
PULL解析器的运行方式和SAX类似,都是基于事件的模式。
读取到xml的声明返回 START_DOCUMENT; 结束返回 END_DOCUMENT ; 开始标签返回 START_TAG;
结束标签返回 END_TAG; 文本返回 TEXT。
Pull解析方法:
1. next方法进入一个解析事件(开始文档、开始标签、结束文档和结束标签等),通过next返回的事件以不是文档结束标志循环
2. 处于一个元素里面的时候,可以使用
getAttributeValue(String namespace, String name) 获取属性值,
也可以getAttributeValue(int index) 第几个属性的值
3. 获取节点的值 String nextText()
例子:
public class PullParserUtils
{
public static List<Person> parserXmlByPull(InputStream inputStream) throws Exception
{
List<Person> persons = null;
Person person = null;
// 创建XmlPullParserFactory解析工厂
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// 通过XmlPullParserFactory工厂类实例化一个XmlPullParser解析类
XmlPullParser parser = factory.newPullParser();
// 根据指定的编码来解析xml文档
parser.setInput(inputStream, "utf-8");
// 得到当前的事件类型
int eventType = parser.getEventType();
// 只要没有解析到xml的文档结束,就一直解析
while(eventType != XmlPullParser.END_DOCUMENT)
{
switch (eventType)
{
// 解析到文档开始的时候
case XmlPullParser.START_DOCUMENT:
persons = new ArrayList<Person>();
break;
// 解析到xml标签的时候
case XmlPullParser.START_TAG:
if("person".equals(parser.getName()))
{
person = new Person();
// 得到person元素的第一个属性,也就是ID
person.setId(Integer.parseInt(parser.getAttributeValue(0)));
}
else if("name".equals(parser.getName()))
{
// 如果是name元素,则通过nextText()方法得到元素的值
person.setName(parser.nextText());
}
else if("age".equals(parser.getName()))
{
person.setAge(Integer.parseInt(parser.nextText()));
}
break;
// 解析到xml标签结束的时候
case XmlPullParser.END_TAG:
if("person".equals(parser.getName()))
{
persons.add(person);
person = null;
}
break;
}
// 通过next()方法触发下一个事件
eventType = parser.next();
}
return persons;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】