Xml解析
一.DOM方式解析
1.将xml文档解析为一个树形结构的Document,以后的操作全都操作这个Document,一个节点就是一个对象,存取对象就是存取xml中的内容,将是实际内容的几倍。
优点:可以遍历文档树,知上下层节点的情况。
2.解析步骤
(1)获取DBF实例(DocumentBuilderFactory.newInstance())
(2)获取DB实例(dbf.newDocumentBuilder())
(3)由DB的对象解析xml(db.parser())
调用parse解析---再用normalize()去掉格式化的空白
二.Pull解析
Pull解析
XMLPullParser xp = Xml.newPullParser(); xp.setInput(is,”utf-8”); Int event = xp.getEventType();//触发一个解析,根据返回的值判断当前解析状态 While(event!=XMLPullParser.END_DOCUMENT){ Switch(event){ Case XMLPullParser.START_DOCUMENT//开始解析 Case XMLPullParser.START_TAG//开始元素 Case XMLPullParser.END_TAGCase XMLPullParser.END_DOCUMENT//结束元素 Case XMLPullParser.TEXT//解析文本 Case XMLPullParser.END_DOCUMENT://结束解析 break; } Xp.next();//触发下一个事件,即下一个元素 } |
|
另一种方法
步骤:
(1)获取XPPF--XmlPullParserFactory.newInstance()
(2)获取XPP--xppf.newPullParser()
(3)解析setInput(isr)
(4)XmlUtils解析文档--开始解析和获取下一个元素
使用Pull生成xml文档
XMLSerializer serializer = Xml.newSerializer(); serializer.setOutput(outputStream,”utf-8”); serializer.startTag(null,”persons”);//开始元素,根节点 for(Person person:persons){ serializer.startTag(null,”person”); serializer.attribute(null,”id”,person.getId().toString());//为元素添加属性 serializer.startTag(null,”name”); serializer.text(person.getText());//添加文本 serializer.endTag(“name”);
serializer.startTag(null,”age”); serializer.text(person.getAge());//添加文本 serializer.endTag(“age”);
serializer.endTag(“pseron”); } serializer.endTag(null,”persons”); serializer.endDocument(); outputStream.flush(); outputStream.close(); |
注: 1.serializer.setOutput(outputStream,”utf-8”);设置输出方向,可以是输出流和写入器,写入器比输出流更加灵活,可以向更多的媒介进行输出,如硬盘,网络,内存等。 2.设置xml的标签即文档元素,通过startTag()开始一个标签,必须与之对应一个endTag()方法 3.对标签添加属性,文本的方法,attribute(),text(); |
|
三.SAX解析
ContentHandler | XMLReader | XMLParser | InputSource | DefaultHandler
|
文档解析接口 | 注册处理器并启动解析器 | 同XMLReader,JAXP对其的封装 | 控制解析器如何读取文档
| 解析接口的实现,通过继承他实现解析xml
|
|
|
|
|
|
步骤:
1.使用SAXParser解析代码
SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); sp.parse(is,handler);//handler是继承自DefaultHandler类的对象,实现处理文档 |
2.使用XMLReader
XMLReader reader = new XMLReader(); reader.setContentHandler(handler); reader.parser(is); |
注:需继承自BaseHandler,在其中处理xml的内容
比较
SAX | PULL | DOM |
内存占用少,速度快,对于反复检索xml来说,SAX比较臃肿 |
| |
| Pull可以生成xml,DOM可以对xml进行修改 |