Android SAX 方式解析XML 字符串
解析Xml文件的三种方式

解析Xml⽂件的三种⽅式1、Sax解析(simple api for xml) 使⽤流式处理的⽅式,它并不记录所读内容的相关信息。
它是⼀种以事件为驱动的XML API,解析速度快,占⽤内存少。
使⽤回调函数来实现。
1class MyDefaultHander extends DefaultHandler{2private List<Student> list;3private Student student;45 @Override6public void startDocument() throws SAXException {7super.startDocument();8 list=new ArrayList<>();9 }1011 @Override12public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {13super.startElement(uri, localName, qName, attributes);14if(qName.equals("student")){15 student=new Student();1617 }18 preTag=qName;19 }2021 @Override22public void endElement(String uri, String localName, String qName) throws SAXException {23if(qName.equals("student")){24 list.add(student);25 }26 preTag=null;27 }2829 @Override30public void characters(char[] ch, int start, int length) throws SAXException {31if(preTag!=null){32if(preTag.equals("id")){33 student.setId(Integer.parseInt(new String(ch,start,length)));34 }else if(preTag.equals("name")){35 student.setName(new String(ch,start,length));36 }else if(preTag.equals("age")){37 student.setAge(Integer.parseInt(new String(ch,start,length)));38 }39 }40 }41public List<Student> getStudents(){42return list;43 }44 }45public List<Student> sax_parser(){46 List<Student> list=null;47try {48 SAXParser parser= SAXParserFactory.newInstance().newSAXParser();49 InputStream is= getAssets().open("student.xml");50 MyDefaultHander hander=new MyDefaultHander();51 parser.parse(is,hander);52 list= hander.getStudents();53 } catch (ParserConfigurationException e) {54 e.printStackTrace();55 } catch (SAXException e) {56 e.printStackTrace();57 } catch (IOException e) {58 e.printStackTrace();59 }60return list;61 }2、Dom解析 DOM(Document Object Model) 是⼀种⽤于XML⽂档的对象模型,可⽤于直接访问XML⽂档的各个部分。
利用 XMLPullParser 进行XML 数据解析和处理

利用 XMLPullParser 进行XML 数据解析和处理使用XMLPullParser进行XML数据解析和处理XMLPullParser是一种在Android平台上常用的用于解析和处理XML数据的工具。
它具有快速、高效的特点,能够准确地解析XML 文档,并提供了灵活的API来处理解析结果。
本文将介绍如何利用XMLPullParser进行XML数据解析和处理。
一、XML数据解析的概念和原理XML数据解析是指将XML文档中的数据提取出来并进行处理的过程。
XML文档是一种标记语言,用于描述结构化的数据。
XML数据解析的过程可以分为以下几个步骤:1. 创建XMLPullParser对象:首先,需要创建一个XMLPullParser 对象,用于解析XML文档。
2. 设置输入源:在进行XML数据解析之前,需要设置XMLPullParser的输入源。
输入源可以是一个文件、一个输入流或者一个URL。
3. 解析XML文档:通过调用XMLPullParser对象的相应方法,可以逐行解析XML文档,获取XML文档中的节点信息和数据。
4. 处理解析结果:根据XML数据的结构和需要,可以使用条件语句、循环结构等方式对解析结果进行处理,提取所需的数据,并进行后续的操作。
二、利用XMLPullParser进行XML数据解析的步骤下面逐步介绍如何使用XMLPullParser进行XML数据解析和处理的具体步骤。
步骤1:导入相关的类和包在使用XMLPullParser进行XML数据解析之前,需要导入相应的类和包。
具体的导入语句如下:import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import org.xmlpull.v1.XmlPullParserFactory;import java.io.InputStream;步骤2:创建XMLPullParser对象需要通过XmlPullParserFactory类的newInstance()方法创建XmlPullParserFactory对象,并通过XmlPullParserFactory对象的newPullParser()方法创建XMLPullParser对象,示例代码如下:XmlPullParserFactory factory = XmlPullParserFactory.newInstance();XmlPullParser parser = factory.newPullParser();步骤3:设置输入源设置XMLPullParser对象的输入源,可以是一个输入流、一个文件或者一个URL。
Android SAX 方式解析XML 字符串

这个是主类:import java.io.StringReader;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.InputSource;import org.xml.sax.XMLReader;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.widget.TextView;public class ParsingXML extends Activity {private final String MY_DEBUG_TAG = "WeatherForcaster";public void onCreate(Bundle icicle) {super.onCreate(icicle);TextView tv = new TextView(this);String xml = "<VCOM version='1.1'><loginlink>aHR0cDovLzE5Mi4xNjguMTA0LjExMy9ldW1zL2NsaWV udC90ZW1 wbGF0ZTIwMDA vbW9iaWxlZW50cnkucGhwP3VzZXJuYW1lPWNlc2hp</loginlink><errmsg ></errmsg></VCOM>";// 创建一个新的字符串StringReader read = new StringReader(xml);// 创建新的输入源SAX 解析器将使用InputSource 对象来确定如何读取XML 输入InputSource source = new InputSource(read);try {SAXParserFactory spf = SAXParserFactory.newInstance();SAXParser sp = spf.newSAXParser();XMLReader xr = sp.getXMLReader();ExampleHandler myExampleHandler = new ExampleHandler();xr.setContentHandler(myExampleHandler);xr.parse(source);ParsedExampleDataSet parsedExampleDataSet = myExampleHandler.getParsedData();String url=Base64Coder.decodeString(parsedExampleDataSet.toString());tv.setText(url);} catch (Exception e) {tv.setText("Error: " + e.getMessage());Log.e(MY_DEBUG_TAG, "WeatherQueryError", e);}this.setContentView(tv);}}下面两个类是以SPX 方式解析XML字符串import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class ExampleHandler extends DefaultHandler{private boolean in_mytag = false;private ParsedExampleDataSet myParsedExampleDataSet = new ParsedExampleDataSet();public ParsedExampleDataSet getParsedData() {return this.myParsedExampleDataSet;}public void startDocument() throws SAXException {this.myParsedExampleDataSet = new ParsedExampleDataSet();}public void endDocument() throws SAXException {}public void startElement(String namespaceURI, String localName,String qName, Attributes atts) throws SAXException {if (localName.equals("loginlink")) {this.in_mytag = true;}}public void endElement(String namespaceURI, String localName, String qName) throws SAXException {if (localName.equals("loginlink")) {this.in_mytag = false;}}public void characters(char ch[], int start, int length) {if(this.in_mytag){myParsedExampleDataSet.setExtractedString(new String(ch, start, length));}}}public class ParsedExampleDataSet {private String extractedString = null;public String getExtractedString() {return extractedString;}public void setExtractedString(String extractedString) { this.extractedString = extractedString;}public String toString(){return "ExtractedString = " + this.extractedString ;}}。
Android开发基础(习题卷9)

Android开发基础(习题卷9)说明:答案和解析在试卷最后第1部分:单项选择题,共70题,每题只有一个正确答案,多选或少选均不得分。
1.[单选题]请阅读下列代码:private String strPara; private void initData() { Intent mIntent = getIntent(); strPara = mIntent.getStringExtra("user"); mTextView2.setText("第一个Activity传递的参数user:"+strPara); }?initData()函数的作用是什么?A)处理第一个Activity的运行数据B)处理第一个Activity传递给第二个Activity的运行数据C)处理第二个Activity的运行数据D)处理第二个Activity传回给第一个Activity的运行数据2.[单选题]Android Activity 生命周期中调用的第一个方法是? ()A)onInit()B)onStart()C)onCreate()D)onBegin()3.[单选题]setResultData()方法的作用是( );A)修改广播接收者的数据B)修改数据并往下传递C)设置广播接收者的数据D)以上都不对4.[单选题]关于Socket 通讯正确的是( )A)服务器端需要ServerSocket 需要绑定端口号B)服务器端需要ServerSocket 需要绑定端口号和IP 地址C)客户端需要Socket ,需要绑定端口号D)客户端需要ServerSocket ,需要绑定端口号5.[单选题]ImageView的视图中,如何设置图片的类型才能使图片位于视图中间(只压不拉)?( )A)FIT_CENTERB)FIT_XYC)CENTERD)CENTER_INSIDE6.[单选题]Android 中不是SAX方式解析xml 需要用的类是( )A)SAXParserFactoryB)XMLReaderC)PullParserD)DefaultHandler7.[单选题]在下列选项中,联系人信息内容提供者的主机名是( )A)contactB)com.android.contactsC)com.android.provider.contactD)com.android.provider.contacts8.[单选题]android 中下列属于Intent 的作用的是()A)实现应用程序间的数据共享B)是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切换页面而消失C)可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带D)处理一个应用程序整体性的工作9.[单选题]下列( )属于Andriod 开发语言的复合数据类型A)无符号整数类型B)联合类型C)接口D)整型10.[单选题]故事课上小花指出刘老师某个故事情节的错误。
xml 格式 解析

xml 格式解析XML格式解析是一种常见的数据解析方法,它可以将XML格式的数据转换为可供程序使用的数据结构。
XML即可扩展标记语言(eXtensible Markup Language),它被广泛应用于数据交换和存储。
下面将介绍XML格式解析的原理和常用的解析方法。
XML格式解析的原理是通过读取XML文件并识别其中的标签、属性和文本内容,将其转换为内存中的数据结构,以便程序进行进一步处理。
XML文件由起始标签、结束标签、属性和文本内容组成。
解析器会根据这些组成部分对XML文档进行解析。
常用的XML格式解析方法有两种:DOM解析和SAX解析。
DOM(文档对象模型)解析是一种将整个XML文档加载到内存中,并构建一个XML树结构的解析方法。
它可以方便地对XML文档进行增删改查操作。
DOM解析器会先将整个XML文档加载到内存中,然后构建一个树状结构,通过遍历树状结构来访问和操作XML文档的节点。
SAX(简单 API for XML)解析是一种基于事件驱动的解析方法。
它边读取XML文档边解析,并在读取到XML文档的不同部分时触发相应的事件。
相比DOM解析,SAX解析更加高效,特别适用于大型XML文件的解析。
SAX解析器会逐行读取XML文档,当遇到起始标签、结束标签或文本内容时触发相应的事件,并通过事件处理程序来处理这些事件。
选择使用DOM解析还是SAX解析取决于具体的需求。
如果需要对XML文档进行多次操作或查询,DOM解析更方便。
但是,如果处理大型XML文件或只需一次性读取XML数据,SAX解析更高效。
总之,XML格式解析是处理XML数据的重要技术。
通过DOM解析和SAX 解析,我们可以将XML格式的数据转换为程序可以处理的数据结构,实现数据的读取、分析和操作。
xml文件解析方法

xml文件解析方法XML文件解析方法引言:XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,它具有良好的可读性和灵活性,被广泛应用于数据交换和配置文件等领域。
在处理XML文件时,解析是必不可少的环节。
本文将介绍几种常用的XML文件解析方法,包括DOM、SAX和StAX。
一、DOM解析方法DOM(文档对象模型)是一种将整个XML文件以树形结构加载到内存中的解析方法。
DOM解析器将XML文件解析为一个树状结构,通过遍历节点来获取和操作XML文件中的数据。
DOM解析方法的优点是易于理解和使用,可以随机访问XML文件中的任意节点,但缺点是占用内存较大,不适用于大型XML文件的解析。
1. 创建DOM解析器对象:使用标准的Java API,可以通过DocumentBuilderFactory类来创建DOM解析器对象。
2. 加载XML文件:通过DOM解析器对象的parse()方法加载XML文件,将其转化为一个树形结构。
3. 遍历节点:使用DOM解析器对象提供的方法,如getElementsByTagName()、getChildNodes()等,可以遍历XML文件中的各个节点,获取节点的名称、属性和文本内容等信息。
4. 获取节点数据:通过节点对象提供的方法,如getNodeName()、getTextContent()等,可以获取节点的名称和文本内容。
二、SAX解析方法SAX(简单API for XML)是一种基于事件驱动的XML解析方法。
在SAX解析过程中,解析器顺序读取XML文件,当遇到节点开始、节点结束或节点文本等事件时,会触发相应的回调方法。
相比于DOM 解析方法,SAX解析方法具有内存占用小、解析速度快的优点,但缺点是无法随机访问XML文件中的节点。
1. 创建SAX解析器对象:使用标准的Java API,可以通过SAXParserFactory类来创建SAX解析器对象。
2. 实现事件处理器:自定义一个事件处理器,实现SAX解析器提供的DefaultHandler类,并重写相应的回调方法,如startElement()、endElement()和characters()等。
SAX解析器解析xml详解

XML的解析器原理及性能比较,SAX详解1 DOMDOM 是用与平台和语言无关的方式表示XML 文档的官方W3C 标准。
DOM 是以层次结构组织的节点或信息片断的集合。
这个层次结构允许开发人员在树中寻找特定信息。
分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。
由于它是基于信息层次的,因而DOM 被认为是基于树或基于对象的。
DOM 以及广义的基于树的处理具有几个优点。
首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。
它还可以在任何时候在树中上下导航,而不是像SAX 那样是一次性的处理。
DOM 使用起来也要简单得多。
另一方面,对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。
这些基于事件的模型,比如SAX。
2 SAX这种处理的优点非常类似于流媒体的优点。
分析能够立即开始,而不是等待所有的数据被处理。
而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。
这对于大型文档来说是个巨大的优点。
事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。
一般来说,SAX 还比它的替代者DOM 快许多。
3 选择DOM 还是选择SAX ?对于需要自己编写代码来处理XML 文档的开发人员来说,选择DOM 还是SAX 解析模型是一个非常重要的设计决策。
DOM 采用建立树形结构的方式访问XML 文档,而SAX 采用的事件模型。
DOM 解析器把XML 文档转化为一个包含其内容的树,并可以对树进行遍历。
用DOM 解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。
可以很容易的添加和修改树中的元素。
然而由于使用DOM 解析器的时候需要处理整个XML 文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML 文件的时候。
由于它的遍历能力,DOM 解析器常用于XML 文档需要频繁的改变的服务中。
XML的四种解析器原理及性能比较

XML的四种解析器原理及性能比较XML(可扩展标记语言)是一种非常常见的数据交换格式,用于在应用程序之间传递和存储数据。
在处理XML数据时,需要使用解析器来读取和解析XML文档。
下面将介绍XML的四种解析器的原理和性能比较。
1. DOM解析器(Document Object Model Parser):DOM解析器将整个XML文档加载到内存中,并将其表示为一个树形结构,每个节点都对应XML文档中的一个元素或属性。
解析器可以通过遍历这个树形结构来访问和操作XML数据。
由于将整个文档加载到内存中,DOM解析器所需的内存较大,适合处理比较小的XML文档。
虽然性能较差,但它提供了灵活的访问和操作XML数据的方法。
2. SAX解析器(Simple API for XML Parser):3. StAX解析器(Streaming API for XML Parser):StAX解析器是一种混合了DOM和SAX解析器的解析器,它允许开发人员以推拉模型访问XML数据。
开发人员可以使用迭代器的形式遍历XML文档,并根据需要拉取或推送事件。
StAX解析器的内存需求较低,同时也具备灵活的操作XML数据的能力。
4. JAXB解析器(Java Architecture for XML Binding):JAXB解析器是一种用于将XML数据绑定到Java对象的解析器。
它可以将XML文档中的元素和属性映射到具体的Java类和对象上,并提供了将Java对象序列化为XML的能力。
相比于前三种解析器,JAXB解析器需要定义Java类和XML的映射关系,稍微复杂一些。
但它提供了方便的对象操作方式,可以更加简洁地处理XML数据。
对于解析性能的比较,DOM解析器的性能最差,因为它需要将整个XML文档加载到内存中。
对于大型XML文档,DOM解析器可能会导致内存不足的问题。
SAX解析器和StAX解析器的性能较好,因为它们是基于事件驱动的解析器,可以逐行读取XML文档,无需将整个文档加载到内存中。
XML解析的三种方法

三种解析XML文件的方法在Android平台上可以使用Simple API for XML(SAX) 、 Document Object Model(DOM)和Android附带的pull解析器解析XML文件。
下面是本例子要解析的XML文件:文件名称:china.xml例子定义了一个javabean用于存放上面解析出来的xml内容,这个javabean为Person,代码:使用SAX读取XML文件SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。
SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。
所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。
下面是一些ContentHandler接口常用的方法:startDocument()当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。
endDocument()和上面的方法相对应,当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。
startElement(String namespaceURI, String localName, String qName, Attributes atts) 当读到一个开始标签的时候,会触发这个方法。
namespaceURI就是命名空间,localName 是不带命名空间前缀的标签名,qName是带命名空间前缀的标签名。
通过atts可以得到所有的属性名和相应的值。
要注意的是SAX中一个重要的特点就是它的流式处理,当遇到一个标签的时候,它并不会纪录下以前所碰到的标签,也就是说,在startElement()方法中,所有你所知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不得而知的,都需要你的程序来完成。
Android开发基础(习题卷6)

Android开发基础(习题卷6)第1部分:单项选择题,共70题,每题只有一个正确答案,多选或少选均不得分。
1.[单选题]对于XML布局文件中的视图控件,layout_width属性的属性值不可以是()A)match_parentB)fill_parentC)wrap_contentD)match_content答案:D解析:2.[单选题]在BaseAdapter的方法中,根据位置得到条目的ID的方法是( )A)getView()B)getItem()C)getItemId()D)getCount()答案:C解析:3.[单选题]为了让一个ImageView控件显示一张图片,可以设置的属性是( )A)android:srcB)android:backgroundC)android: imgD)android:value答案:A解析:4.[单选题]在Java 中, ( )类提供定位本地文件系统,对文件或目录及其属性进行基本操作。
A)FileInputStreamB)FileReaderC)FileWriterD)File答案:D解析:5.[单选题]GestureDetector 中onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 方法中的参数e1 代表( ) 。
A)抬起来的那个事件B)按下去和抬起来的事件C)按下去的那个事件D)以上都不对答案:C解析:答案说明: e1: 按下去的那个事件, e2: 抬起来的那个事件velocityX 是X轴的速度, 单位是像素, velocityY 是Y轴的速度, 单位是像素;6.[单选题]下面关于JSON说法错误的是:( )A)json 是一种数据交互格式。
B)json 的数据格式有两种为{ }和[ ]C)json 数据用{ }表示java 中的对象, [ ]表示Java中的List 对象D){“1”:”123”, ”2”:”234”, ”3”:”345”} 不是json 数据答案:D解析:7.[单选题]在播放视频或音频时,如果有电话打入,这时候视频或音频会自动挂起吗?( )A)不会B)会C)有的手机会,有的手机不会D)以上说法都错误答案:A解析:8.[单选题]在Android应用开发中,使用()作为项目唯一标识。
SAX解析XML

SAX解析XMLsax解析特点:1、逐⾏读取2、事件处理-- ⽅法3、解析器调⽤相应的事件 4、只能读取⽂件DefaultHandler 可以触发5个事件*startDocument() 开始⽂档*startElement() 开始元素*characters() ⽂本*endElement() 结束元素*endDocument() 结束⽂档在startElement/*** 如果xml⽂件使⽤了schema约束 <xs:element>* * uri:schema -- targetNameSpace* * localName--element* * qName---xs:element* 如果不使⽤* * uri:null* * localName:null* * qName : element** Attributes:当前元素的所有的属性的集合*/1//获得解析⼯⼚实例2 SAXParserFactory factory=SAXParserFactory.newInstance();3//获得解析器4 SAXParser parser=factory.newSAXParser();5//解析xml6 DefaultHandler dh=new MyDefaultHandler();78 parser.parse("books.xml", dh);Demo1public void SaxDemo() throws Exception2 {3 SAXParser parser= SAXParserFactory.newInstance().newSAXParser();4 parser.parse(Demo.class.getClassLoader().getResourceAsStream("users.xml"), new DefaultHandler(){ 5private boolean nameOrAge=false;6 @Override7public void startElement(String uri, String localName,8 String qName, Attributes attributes) throws SAXException {9if(qName.equals("user"))10 {11 System.err.println(attributes.getValue("id"));12 }13else if(qName.equals("name") || qName.equals("age")){14 nameOrAge=true;15 }16 }1718 @Override19public void endElement(String uri, String localName, String qName)20throws SAXException {21if(qName.equals("name")|| qName.equals("age"))22 {23 nameOrAge=false;24 }25 }2627 @Override28public void characters(char[] ch, int start, int length) 29throws SAXException {30if(nameOrAge)31 {32 String value=new String(ch,start,length);33 System.err.println(value);34 }35 }3637 });38 }。
解析xml格式字符串标签数据的方法

解析xml格式字符串标签数据的方法
XML格式字符串是一种常见的数据格式,它由标签和标签中的数据组成。
解析XML格式字符串中的标签数据可以帮助我们更方便地获取和处理数据。
以下是解析XML格式字符串标签数据的方法:
1. 使用DOM解析器:DOM解析器是一种常用的解析XML格式字符串的方法。
它可以将整个XML文档加载到内存中,然后通过对DOM树进行操作来获取标签数据。
具体步骤是:使用DOM解析器加载XML文件,然后通过对DOM树进行遍历,找到所需的标签并获取其中的数据。
2. 使用SAX解析器:SAX解析器是一种基于事件驱动的解析XML格式字符串的方法。
它可以在解析XML文件的过程中触发一系列事件,程序员可以根据这些事件来获取标签数据。
具体步骤是:使用SAX解析器解析XML文件,然后在遇到标签时触发startElement事件,在标签结束时触发endElement事件,程序员可以在这些事件中获取标签数据。
3. 使用XPath:XPath是一种用于在XML文档中定位节点的语言,它可以帮助我们更方便地获取标签数据。
具体步骤是:使用XPath解析器加载XML文件,然后使用XPath表达式在XML文档中定位所需的标签,最后获取标签中的数据。
以上是解析XML格式字符串标签数据的一些常用方法,程序员可以根据自己的需求选择适合的方法来获取和处理数据。
android三个特殊的资源目录resxmlresraw和assets

android三个特殊的资源目录resxmlresraw和assets在android开发中,我们离不开资源文件的使用,从drawable到string,再到layout,这些资源都为我们的开发提供了极大的便利,不过我们平时大部分时间接触的资源目录一般都是下面这三个。
/res/drawable/res/values/res/layout但android的资源文件并不止这些,下面就为大家介绍一下另外三个资源目录/res/xml/res/raw/assets首先是/res/xml ,这个目录中大家可能偶尔用到过,这里可以用来存储xml格式的文件,并且和其他资源文件一样,这里的资源是会被编译成二进制格式放到最终的安装包里的,我们也可以通过R类来访问这里的文件,并且解析里面的内容,例如我们在这里存放了一个名为data.xml的文件:1.<?xml version="1.0" encoding="utf-8"?>2.<root>3.<title>Hello XML!</title>4.</root>复制代码随后,我们就可以通过资源ID来访问并解析这个文件了:1.2.XmlResourceParser xml = getResources().getXml(R.xml.data);3.xml.next();4.int eventType = xml.getEventType();5.boolean inTitle = false;6.while(eventType != XmlPullParser.END_DOCUMENT) {7.8.//到达title节点时标记一下9.if(eventType == XmlPullParser.START_TAG) {10.if(xml.getName().equals("title")) {11.inTitle = true;12.}13.}14.15.//如过到达标记的节点则取出内容16.if(eventType == XmlPullParser.TEXT && inTitle) {17.((TextView)findViewById(R.id.txXml)).setText(18.xml.getText()19.);20.}21.22.xml.next();23.eventType = xml.getEventType();24.}复制代码在这里,我们用资源类的getXml方法,返回了一个xml解析器,这个解析器的工作原理和SAX方式差不多,有关SAX的具体细节可以看看我的另一篇帖子:要注意的是,这里的xml文件,最终是会被编译成二进制形式的,如果大家想让文件原样存储的话,那么就要用到下一个目录啦,那就是/res/raw目录这个目录的唯一区别就是,这里的文件会原封不动的存储到设备上,不会被编译为二进制形式,访问的方式也是通过R类,下面是一个例子:1.2.((TextView)findViewById(R.id.txRaw)).setText(3.readStream(getResources().openRawResource(R.raw.rawt ext))4.);5.6.private String readStream(InputStream is) {7.8.try {9.ByteArrayOutputStream bo = new ByteArrayOutputStream();10.int i = is.read();11.while(i != -1) {12.bo.write(i);13.i = is.read();14.}15.16.return bo.toString();17.} catch (IOException e) {18.return "";19.}20.}复制代码这次使用资源类中的方法,openRawResource,返回给我们一个输入流,这样我们就可以任意读取文件中的内容了,例如上面例子中那样,原样输出文本文件中的内容。
解析xml格式字符串标签数据的方法

解析xml格式字符串标签数据的方法XML格式字符串是一种常用的数据格式,它可以表示复杂的数据结构。
在处理XML格式字符串时,我们需要解析其中的标签数据,才能获取其中的内容。
下面是几种解析XML格式字符串标签数据的方法: 1. DOM解析:DOM是Document Object Model的缩写,它将XML 数据组织成一个树形结构,可以通过操作节点对象来访问和修改数据。
使用DOM解析XML格式字符串需要加载完整的XML文档到内存中,因此适合处理较小的XML数据,但对于大型XML数据,DOM解析可能会导致性能问题。
2. SAX解析:SAX是Simple API for XML的缩写,它是一种基于事件驱动的解析方式,可以在读取XML数据时逐个处理数据。
SAX解析对内存的要求非常低,适合处理大型XML数据,但由于它是基于事件驱动的,因此需要编写复杂的回调函数来处理数据。
3. XPath解析:XPath是一种查询语言,可以通过路径表达式来访问XML数据中的元素、属性等。
使用XPath解析XML格式字符串时,可以通过XPath表达式来获取特定的元素或属性的值,非常方便。
不过,XPath解析需要加载完整的XML文档到内存中,对于大型XML数据仍然存在性能问题。
4. XML解析器:除了DOM、SAX和XPath解析之外,还有一些XML 解析器可以用来解析XML格式字符串。
例如,Python中的ElementTree 模块提供了一种简单的解析方式,可以快速地访问和修改XML数据。
总之,在解析XML格式字符串时,需要根据实际的需求选择合适的解析方式。
如果对内存要求比较高,可以使用SAX解析;如果需要快速访问和修改XML数据,可以考虑使用XPath解析或XML解析器。
xml的四种解析方法及源代码

xml的四种解析方法及源代码(SAX、DOM、JDOM、DOM4J)第一种:SAX解析SAX处理机制:SAX是一种基于事件驱动的API。
利用SAX解析XML文档,牵涉到两个部分:解析器和事件处理器。
解析器负责读取XML文档,并向事件处理器发生事件,如元素开始和元素结束事件;而事件处理器则负责对事件做出响应,对传递的XML数据进行处理。
测试用的xml文件:db.xmlXml代码<?xml version="1.0"encoding="UTF-8"?><!--<!DOCTYPE dbconfig SYSTEM "db.dtd">--><dbconfig><db type="oracle"><driver>oracle.jdbc.driver.OracleDriver</driver><url>jdbc:oracle:thin:@localhost:1521:oracle</url><user>scott</user><password>tiger</password></db></dbconfig><?xml version="1.0" encoding="UTF-8"?><!--<!DOCTYPE dbconfig SYSTEM "db.dtd">--><dbconfig><db type="oracle"><driver>oracle.jdbc.driver.OracleDriver</driver><url>jdbc:oracle:thin:@localhost:1521:oracle</url><user>scott</user><password>tiger</password></db></dbconfig>DTD文件db.dtdXml代码<!ELEMENT dbconfig (db+)><!ELEMENT db (driver,url,user,password)><!ELEMENT driver (#PCDATA)><!ELEMENT url (#PCDATA)><!ELEMENT user (#PCDATA)><!ELEMENT password (#PCDATA)><!ATTLIST db type CDATA #REQUIRED><!ELEMENT dbconfig (db+)><!ELEMENT db (driver,url,user,password)><!ELEMENT driver (#PCDATA)><!ELEMENT url (#PCDATA)><!ELEMENT user (#PCDATA)><!ELEMENT password (#PCDATA)><!ATTLIST db type CDATA #REQUIRED>SAX解析实例一org.xml.sax.DefalutHandler类: 可以扩展该类,给出自己的解析实现SAXPrinter.javaJava代码import java.io.File;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class SAXPrinter extends DefaultHandler{/** *//*** 文档开始事件*/public void startDocument() throws SAXException{System.out.println("<?xml version=\"1.0\" encoding=\"utf-8 \"?>");}/** *//*** 接收处理指令事件*/public void processingInstruction(String target, String data) throws SAXException{System.out.println("<?"+target+" "+data+"?>");}/** *//*** 元素开始事件* 参数说明:* uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
解析XML格式数据实例

解析XML格式数据实例前言:网络数据传输时,最常用的格式有两种:XML和JSON,下面我们就研究如何使用Pull解析和Sex解析来实现对XML格式文件数据的解析。
实例流程:1.创建服务器:Apache服务器(用于模拟解析网络中的数据)2.在Apache安装目录下的htdocs目录下创建xml格式的文件(用于解析)3.使用Pull方法解析XML数据4.使用SAX方法解析XML数据实例完整步骤:1.创建服务器(可以借鉴这篇博客创建自己的服务器,我就是看这篇的博客)2.在Apache安装目录下的ht docs目录下创建xml格式的文件(用于解析),我创建了get_dat a.xml文件,内容为:<apps> <app> <id>1</id> <name>Google Maps</name> <virsion>1.0</virsion> </app> <app> <id>2</id> <name>Chrome</name> <version>2.1</version> </app> <app> <id>3</id> <name>Google Play</name> <version>2.3</version> </app> </apps>1234567891011121314151617好了,这就是我们需要的准备工作,下面我们来实现使用Pull解析xml格式的数据。
3.使用Pull方法解析XML数据,代码如下:首先是布局文件,添加一个button控件就可以了:<?xml version='1.0' encoding='utf-8'?><LinearLayout xmlns:android='/apk/res/android'xmlns:tools='/tools'android:layout_width='match_parent'android:layout_height='match_parent'android:orientation='vertical'tools:context='worktest.MainActivity'><Buttonandroid:id='@ id/send_request_btn'android:layout_width='match_parent'android:layout_height='wrap_content'android:text='send request' /></LinearLayout>1231011121314151617接着我们来修改java代码部分:public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final String TAG = 'MainActivity'; private Button requestBtn; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(yout.activity_main); bindID(); } private void bindID() { requestBtn = findViewById(R.id.send_request_btn); requestBtn.setOnClickListener(this); } @Override public voidonClick(View v) { switch (v.getId()) { case R.id.send_request_btn: requestWithHttpURLConnection(); break; default: break; } } private void requestWithHttpURLConnection() { new Thread(new Runnable() { @Override public void run() { //这里我使用了OKHttp插件实现访问网络数据,有什么不懂可以看我的前一篇博客 OkHttpClient client = new OkHttpClient(); Request request= new Request.Builder() //这里是将要访问的网络,其中10.0.2.2对Android模拟器来说是计算机本机的IP地址.url('http://10.0.2.2/get_data.xml') .build(); try { final Response response = client.newCall(request).execute(); String responseData = response.body().string(); //调用自定义的parseXMLWithPull()方法实现对XML数据的解析parseXMLWithPull(responseData); } catch (IOException e) { e.printStackTrace(); } } }).start(); } private void parseXMLWithPull(String xmlData) { try { //首先获得XmlPullParserFactory对象 XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); //获得XmlPullParser对象 XmlPullParser xmlPullParser = factory.newPullParser(); //调用setPut()方法将服务器返回的数据放入xmlPullParser中 xmlPullParser.setInput(new StringReader(xmlData)); //获得当前解析事件int eventType = xmlPullParser.getEventType(); String id = null; String name = null; String version = null; while (eventType != XmlPullParser.END_DOCUMENT) { //获得当前解析事件的当前节点的名字,一个解析事件会有多个节点 String nodeName = xmlPullParser.getName(); switch (eventType) { //我的理解是当前解析事件开始事件 case XmlPullParser.START_TAG: if('id'.equals(nodeName)) { //获得当前节点的名字 id = xmlPullParser.nextText(); } else if ('name'.equals(nodeName)) { name = xmlPullParser.nextText(); } else if ('version'.equals(nodeName)) { version = xmlPullParser.nextText(); } break; //我的理解是当前解析事件结束事件 case XmlPullParser.END_TAG: if ('app'.equals(nodeName)) { //当前解析事件结束,打印出解析的结果Log.e(TAG, 'parseXMLWithPull: ' 'id=' id); Log.e(TAG, 'parseXMLWithPull: ' 'name=' name); Log.e(TAG,'parseXMLWithPull: ' 'version' version); } break; default: break; } //获得下一个解析事件 eventType =xmlPullParser.next(); } } catch (Exception e) { e.printStackTrace(); } } }12345678910111213141516171819202122232425262735 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 8182 83 84 85 86949596979899100over效果展现:4.使用SAX方法解析XML数据1.新建类继承DefaultHandler重写五种方法:public class ContentHandler extends DefaultHandler {private String nodeName;private StringBuilder id;private StringBuilder name;private StringBuilder version;private static final String TAG = 'ContentHandler';//开始xml解析的时候被调用@Overridepublic void startDocument() throws SAXException {super.startDocument();id = new StringBuilder();name = new StringBuilder();version = new StringBuilder();}//开始解析某个节点时被调用@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes);//获取当前节点名nodeName = localName;}//获取当前节点的内容@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {super.characters(ch, start, length);if ('id'.equals(nodeName)){id.append(ch,start,length);}else if('name'.equals(nodeName)){name.append(ch,start,length);}else if('version'.equals(nodeName)){version.append(ch,start,length);}//Log.e(TAG, 'characters: ' 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh' );}//完成解析某个节点时被调用@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {super.endElement(uri, localName, qName);if('app'.equals(localName)){//因为characters()方法可能将一些换行符读入,所以要调用trim()方法Log.e(TAG, 'endElement: ' 'id=' id.toString().trim());Log.e(TAG, 'endElement: ' 'name=' name.toString().trim() );Log.e(TAG, 'endElement: ' 'version=' version.toString().trim() );//不要忘了将stringbuilder清空id.setLength(0);name.setLength(0);version.setLength(0);}}@Overridepublic void endDocument() throws SAXException {super.endDocument();}}4567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556在java代码出调用:e.printStackTrace(); } } }).start(); } private void parseXMLWithSEX(String xmlData) { try { SAXParserFactory factory = SAXParserFactory.newInstance(); XMLReader xmlReader = factory.newSAXParser().getXMLReader(); ContentHandler contentHandler = new ContentHandler(); //使用setContentHandler()方法将ContentHandler对象放入xmlReader中xmlReader.setContentHandler(contentHandler); //解析xml数据 xmlReader.parse(new InputSource(newStringReader(xmlData))); } catch (Exception e) { e.printStackTrace(); } } }1234567891011121314151617181920212223242526272829303132333435363738394041424344over,运行效果和之前的一样。
Dom4J、JDOM、DOM、SAX和Pull技术解析XML文件

解析XML文件的五种技术1.1SAX技术SAX处理的优点非常类似于流媒体的优点。
分析能够立即开始,而不是等待所有的数据被处理。
而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。
这对于大型文档来说是个巨大的优点。
事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。
一般来说,SAX还比它的替代者DOM快许多。
选择DOM还是选择SAX?对于需要自己编写代码来处理XML文档的开发人员来说,选择DOM 还是SAX解析模型是一个非常重要的设计决策。
DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。
DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。
用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。
可以很容易的添加和修改树中的元素。
然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。
由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。
SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。
SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag.特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。
但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。
1.1.1 SAX语法简介SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。
SAX 解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。
SAXContentHandler解析超大的XML内容

SAXContentHandler解析超大的XML内容Java Sax ContentHandler 解析超大的XML解析超大的XML文件或者文本使用如果用常用的方法,100M的文件可能要1个多小时,甚至于还可能出现内存溢出等问题。
本文介绍ContentHandler解析超大的xml内容,100M的内容1~2秒左右就解析并入库成功1、构造一个ContentHandlerimport java.util.ArrayList;import java.util.List;import org.springframework.util.CollectionUtils;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class RecipientHandler extends DefaultHandler {private List<Recipient> recipients;private List<NameValue> fields;private Recipient recipient;private NameValue field;private TestService testService;private StringBuilder sb = new StringBuilder();public RecipientHandler(T estService testService) {this.testService = testService;}@Overridepublic void startDocument() throws SAXException {recipients = new ArrayList<>();fields = new ArrayList<>();}@Overridepublic void endDocument() throws SAXException {saveRecipients();}@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { sb.delete(0, sb.length()); // 清空sbif('recipients'.equals(qName)) {recipient = new Recipient();} else if('fields'.equals(qName)) {field = new NameValue();}}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {if ('recipients'.equals(qName)) {// 将fields整理成recipient对象for (NameValue field : fields) {String name = field.getName();if('name'.equals(name)) {recipient.setName(field.getValue());} else if('create_date'.equals(name)) {recipient.setCreateDate(field.getValue());}}recipients.add(recipient);fields.clear();if (recipients.size() >= 1000) {saveRecipients(); // 保存}} else if('fields'.equals(qName)) {fields.add(field);} else if('id'.equals(qName)){recipient.setId(sb.toString());} else if('name'.equals(qName)){field.setName(sb.toString());} else if('value'.equals(qName)){field.setValue(sb.toString());}}private void saveRecipients() {if(CollectionUtils.isEmpty(recipients) || testService == null) { return;}testService.addRecipients(recipients);recipients.clear();}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {String data = new String(ch, start, length).trim();sb.append(data); // 当文本过大时,可能不能一次取到完整的data值,会分多次获取}}2、使用ContentHandlerXMLReader parser = XMLReaderFactory.createXMLReader();// RecipientHandler 实现了解析数据,并保存到数据库parser.setContentHandler(newRecipientHandler(testService));StringReader stringReader = new StringReader(xmlString);InputSource is = new InputSource(stringReader);is.setEncoding('UTF-8');parser.parse(is);总体代码特别少,SAX一次解析就获取到所有的业务数据。
安卓系统的一些选择题

33、(1分)Android中网络互连中需要获取状态码,根据状态码来判断请求是否已经完成,下列状
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android SAX 方式解析XML 字符串
这个是主类:
import java.io.StringReader;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.Reader;
import ..Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.;
public class ParsingXML extends Activity {
private final String MY_DEBUG_TAG = "WeatherForcaster";
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
Text tv = new TextView(this);
String xml = "<VCOM
version='1.1'><loginlink>aHR0cDovLzE5Mi4xNjguMTA0LjExMy9ldW1zL2NsaWVudC90ZW1wbGF0ZTI wMDAvbW9iaWxlZW50cnkucGhwP3VzZXJuYW1lPWNlc2hp</loginlink><errmsg></errmsg></VCOM>"; // 创建一个新的字符串
StringReader read = new StringReader(xml);
// 创建新的输入源SAX 解析器将使用InputSource 对象来确定如何读取XML 输入
InputSource source = new InputSource(read);
try {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
ExampleHandler myExampleHandler = new ExampleHandler();
xr.setContentHandler(myExampleHandler);
xr.parse(source);
ParsedExampleDataSet parsedExampleDataSet = myExampleHandler
.getParsedData();
String url=BaseCoder.decodeString(parsedExampleDataSet.toString());
tv.setText(url);
} catch (Exception e) {
tv.setText("Error: " + e.getMessage());
Log.e(MY_DEBUG_TAG, "WeatherQueryError", e);
}
this.setContentView(tv);
}
}
下面两个类是以SPX 方式解析XML字符串
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class ExampleHandler extends DefaultHandler{
private boolean in_mytag = false;
private ParsedExampleDataSet myParsedExampleDataSet = new ParsedExampleDataSet();
public ParsedExampleDataSet getParsedData() {
return this.myParsedExampleDataSet;
}
public void startDocument() throws SAXException {
this.myParsedExampleDataSet = new ParsedExampleDataSet();
}
public void endDocument() throws SAXException {
}
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) throws SAXException {
if (localName.equals("loginlink")) {
this.in_mytag = true;
}
}
public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
if (localName.equals("loginlink")) {
this.in_mytag = false;
}
}
public void characters(char ch[], int start, int length) {
if(this.in_mytag){
myParsedExampleDataSet.setExtractedString(new String(ch, start, length));
}
}
}
public class ParsedExampleDataSet {
private String extractedString = null;
public String getExtractedString() {
return extractedString;
}
public void setExtractedString(String extractedString) { this.extractedString = extractedString;
}
public String toString(){
return "ExtractedString = " + this.extractedString ;
}
}。