Android SAX 方式解析XML 字符串

合集下载

移动应用开发中的数据解析和格式转换

移动应用开发中的数据解析和格式转换

移动应用开发中的数据解析和格式转换在移动应用开发过程中,数据解析和格式转换是一个至关重要的环节。

无论是从服务器端获取数据,还是将数据展示给用户,数据的解析和格式转换对于应用的性能和用户体验起着至关重要的作用。

本文将探讨移动应用开发中的数据解析和格式转换的一些常见方法和技术。

一、XML解析XML(可扩展标记语言)是一种用来存储和传输数据的标签语言,在移动应用开发中得到了广泛应用。

XML解析通过解析XML文件,将数据提取出来,方便应用对数据进行处理和展示。

Android平台上的XML解析主要有两种方式:DOM解析和SAX解析。

DOM解析是将整个XML文件加载到内存中,然后以树形结构的方式解析文件。

这种方式适用于文件较小、结构简单的情况,但对于大型XML文件来说,由于需要加载整个XML文件,会消耗较大的内存资源。

SAX解析则是采用事件驱动的方式来解析XML文件,逐行读取文件并触发相应事件来处理数据。

SAX解析在解析大型或复杂的XML文件时更为高效,因为它一次只处理一行数据,不需要将整个文件加载到内存中。

二、JSON解析JSON(JavaScript对象表示法)是一种轻量级的数据交换格式,广泛用于移动应用开发中。

相对于XML,JSON具有更加简洁、易读的结构,解析起来也更加高效。

在移动应用中,可以通过将JSON格式的数据请求服务器获取到的数据进行解析和处理。

在Android平台上,可以使用JSONObject和JSONArray两个类来解析和存储JSON数据。

JSONObject用于解析和处理JSON对象,而JSONArray则用于解析和处理JSON数组。

通过这两个类的方法,可以方便地将JSON格式的数据转换为Java对象,以便在应用中进行处理和展示。

三、数据格式转换在移动应用开发中,经常需要将不同格式的数据进行转换。

例如,将日期的字符串格式转换成日期对象,将数据的单位进行转换等。

Java提供了一些常用的类和方法来实现这些数据格式的转换。

SAXContentHandler解析超大的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一次解析就获取到所有的业务数据。

解析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⽂档的各个部分。

Android考试题库

Android考试题库

一、单选题(共33题,共62分)1、(2分) WebView中可以用来处理js中警示,确认等对话框的是(C)A。

WebSettingsB。

WebViewClientC。

WebChromeClientD。

WebViewChrome2、(2分) Android解析xml的方法中,将整个文件加载到内存中进行解析的是?(C)A、SAXB、PULLC、DOM D 、JSON3、(2分)以下属于调用摄像头硬件的权限的是:( A )A。

〈uses—permission android:name="android.permission。

CAMERA"/〉B。

〈uses-permission android:name=”android。

permission。

MOUNT_UNMOUNT_FILESYSTEMS”/〉C。

〈uses-permission android:name="android。

permission.WRITE_EXTERNAL_STORAGE”/> D。

<uses—permission android:name="android。

permission。

INTERNET"/〉4、(1分)使用Android系统进行拍照用到的类有:(D)A。

SurfaceView B。

SurfaceHolder C.Callback D。

Camera5、(2分)LocationManager获取位置信息的途径下列说法不正确的是(B )A, GPS定位更精确,缺点是只能在户外使用B, NETWORK通过基站和Wi— Fi信号来获取位置信息,速度较慢,耗电较少.C,获取用户位置信息,我们可以使用其中一个,也可以同时使用两个。

D, GPS定位耗电严重,并且返回用户位置信息的速度远不能满足用户需求.6、(2分) 在开发AppWidget窗口小部件时, 需要继承(D)类A,AppWidgetReceiverB,AppWidgetConfigureC,AppWidgetManagerD,AppWidgetProvider7、(4分)在AsyncTask中下列哪个方法是负责执行那些很耗时的后台计算工作的(C)A,runB,executeC,doInBackgroundD,onPostExecute8、(2分)如果希望自定义TabHost标题部分的显示内容需要使用下列哪个方法(B)finalTabHosttabHost = getTabHost();A,tabHost。

Android开发基础(习题卷9)

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.[单选题]故事课上小花指出刘老师某个故事情节的错误。

Androidstrings.xml中定义字符串显示空格

Androidstrings.xml中定义字符串显示空格

Androidstrings.xml中定义字符串显⽰空格<string name="str">字&#160;符&#160;串</string>其中 &#160;就表⽰空格。

如果直接在⾥⾯键⼊空格,⽆论多少空格都只会显⽰⼀个。

⽤的XML转义字符记录如下:空格: <string name="out_bound_submit">出&#160;&#160;库</string> 其中的&#160;就代表空格换⾏: <string name="hello_world">你好!\n世界!</string> 其中的\n就代表换⾏缩进: <string name="hello_world">你好!\t世界!</string> 其中的\t就代表按⼀次Tab键的⼏个空格应当注意,由于系统定义的基本的缩进的格数不同,有的代表4个半⾓字符,有的代表8个半⾓字符,所以可能显⽰时效果不同,建议如果编写界⾯时尽量少⽤。

" : &#34; 或 &quot;' : &#39; 或 &apos;& : &#38; 或 &amp;lt(<) : &#60; 或 &lt;gt(>) : &#62; 或 &gt;项⽬中要在string.xml 中显⽰特殊符号、如@号冒号等、直接写肯定不⾏啦只能考虑使⽤ASCII码进⾏显⽰、在XML中空格符不是⽤HMTL中的表⽰、⽽是⽤编码表⽰以下为常见的ASCII⼗进制交换编码:&#064; 对应 -----@-----&#058; 对应 -----:-----&#160; 对应 -----空格-----&#032; 对应 -----空格-----&#033; 对应 -----!-----&#034; 对应 -----"(xml中需要在前⾯加⼊)-----&#035; 对应 -----#-----&#036; 对应 -----$-----&#037; 对应 -----%-----&#038; 对应 -----&-----&#039; 对应 -----´-----&#040; 对应 -----(-----&#041; 对应 -----)-----&#042; 对应 -----*-----&#043; 对应 -----+-----&#044; 对应 -----,-----&#045; 对应 -----------&#046; 对应 -----.-----&#047; 对应 -----/-----&#058; 对应 -----:-----&#059; 对应 -----;-----&#060; 对应 -----<-----&#061; 对应 -----=-----&#096; 对应 -----`-----&#123; 对应 -----{-----&#124; 对应 -----|-----&#125; 对应 -----}-----&#126; 对应 -----~-----&#160; 对应 -----(这边是空格,在xml⾸字符中不会被忽略)-----&#161; 对应 -----¡-----&#162; 对应 -----¢-----&#163; 对应 -----£-----&#164; 对应 -----¤-----&#165; 对应 -----¥-----&#166; 对应 -----¦-----&#167; 对应 -----§-----&#168; 对应 -----¨-----&#169; 对应 -----©-----&#170; 对应 -----ª-----&#171; 对应 -----«-----&#172; 对应 -----¬-----&#173; 对应 ----------&#174; 对应 -----®-----&#175; 对应 -----¯-----&#176; 对应 -----°-----&#177; 对应 -----±-----&#178; 对应 -----²-----&#179; 对应 -----³-----&#180; 对应 -----´-----&#181; 对应 -----µ-----&#182; 对应 -----¶-----&#183; 对应 -----•-----&#184; 对应 -----¸-----&#185; 对应 -----¹-----&#186; 对应 -----º-----&#187; 对应 -----»-----&#188; 对应 -----¼-----&#189; 对应 -----½-----&#190; 对应 -----¾-----&#191; 对应 -----¿-----&#192; 对应 -----À-----&#193; 对应 -----Á-----&#194; 对应 -----Â-----&#195; 对应 -----Ã-----&#196; 对应 -----Ä-----&#197; 对应 -----Å-----&#198; 对应 -----Æ-----&#199; 对应 -----Ç-----&#200; 对应 -----È-----&#201; 对应 -----É-----&#202; 对应 -----Ê-----&#203; 对应 -----Ë-----&#204; 对应 -----Ì-----&#205; 对应 -----Í-----&#206; 对应 -----Î-----&#207; 对应 -----Ï-----&#208; 对应 -----Ð-----&#209; 对应 -----Ñ-----&#210; 对应 -----Ò-----&#211; 对应 -----Ó-----&#212; 对应 -----Ô-----&#213; 对应 -----Õ-----&#214; 对应 -----Ö-----&#223; 对应 -----ß-----&#224; 对应 -----à-----&#225; 对应 -----á-----&#226; 对应 -----â-----&#227; 对应 -----ã-----&#228; 对应 -----ä-----&#229; 对应 -----å-----&#230; 对应 -----æ-----&#231; 对应 -----ç-----&#232; 对应 -----è-----&#233; 对应 -----é-----&#234; 对应 -----ê-----&#235; 对应 -----ë-----&#236; 对应 -----ì-----&#237; 对应 -----í-----&#238; 对应 -----î-----&#239; 对应 -----ï-----&#240; 对应 -----ð-----&#241; 对应 -----ñ-----&#242; 对应 -----ò-----&#243; 对应 -----ó-----&#244; 对应 -----ô-----&#245; 对应 -----õ-----&#246; 对应 -----ö-----&#247; 对应 -----÷-----&#248; 对应 -----ø-----&#249; 对应 -----ù-----&#250; 对应 -----ú-----&#251; 对应 -----û-----&#252; 对应 -----ü-----&#253; 对应 -----ý-----&#254; 对应 -----þ-----&#255; 对应 -----ÿ-----&#256; 对应 -----Ā-----&#257; 对应 -----ā-----&#258; 对应 -----Ă-----&#259; 对应 -----ă-----&#260; 对应 -----Ą-----&#261; 对应 -----ą-----&#262; 对应 -----Ć-----&#263; 对应 -----ć-----&#264; 对应 -----Ĉ-----&#265; 对应 -----ĉ-----&#266; 对应 -----Ċ-----&#267; 对应 -----ċ-----&#268; 对应 -----Č-----&#269; 对应 -----č-----&#270; 对应 -----Ď-----&#271; 对应 -----ď-----&#272; 对应 -----Đ-----&#273; 对应 -----đ-----&#274; 对应 -----Ē-----&#275; 对应 -----ē-----&#276; 对应 -----Ĕ-----&#277; 对应 -----ĕ-----&#278; 对应 -----Ė-----&#279; 对应 -----ė-----&#280; 对应 -----Ę-----&#281; 对应 -----ę-----&#282; 对应 -----Ě-----&#291; 对应 -----ģ-----&#292; 对应 -----Ĥ-----&#293; 对应 -----ĥ-----&#294; 对应 -----Ħ-----&#295; 对应 -----ħ-----&#296; 对应 -----Ĩ-----&#297; 对应 -----ĩ-----&#298; 对应 -----Ī-----&#299; 对应 -----ī-----&#300; 对应 -----Ĭ-----&#301; 对应 -----ĭ-----&#302; 对应 -----Į-----&#303; 对应 -----į-----&#304; 对应 -----İ-----&#305; 对应 -----ı-----&#306; 对应 -----IJ-----&#307; 对应 -----ij-----&#308; 对应 -----Ĵ-----&#309; 对应 -----ĵ-----&#310; 对应 -----Ķ-----&#311; 对应 -----ķ-----&#312; 对应 -----ĸ-----&#313; 对应 -----Ĺ-----&#314; 对应 -----ĺ-----&#315; 对应 -----Ļ-----&#316; 对应 -----ļ-----&#317; 对应 -----Ľ-----&#318; 对应 -----ľ-----&#319; 对应 -----Ŀ-----&#320; 对应 -----ŀ-----&#321; 对应 -----Ł-----&#322; 对应 -----ł-----&#323; 对应 -----Ń-----&#324; 对应 -----ń-----&#325; 对应 -----Ņ-----&#326; 对应 -----ņ-----&#327; 对应 -----Ň-----&#328; 对应 -----ň-----&#329; 对应 -----ʼn-----&#330; 对应 -----Ŋ-----&#331; 对应 -----ŋ-----&#332; 对应 -----Ō-----&#333; 对应 -----ō-----&#334; 对应 -----Ŏ-----&#335; 对应 -----ŏ-----&#336; 对应 -----Ő-----&#337; 对应 -----ő-----&#338; 对应 -----Œ-----&#339; 对应 -----œ-----&#340; 对应 -----Ŕ-----&#341; 对应 -----ŕ-----&#342; 对应 -----Ŗ-----&#343; 对应 -----ŗ-----&#344; 对应 -----Ř-----&#345; 对应 -----ř-----&#346; 对应 -----Ś-----&#347; 对应 -----ś-----&#348; 对应 -----Ŝ-----&#349; 对应 -----ŝ-----&#350; 对应 -----Ş-----&#359; 对应 -----ŧ-----&#360; 对应 -----Ũ-----&#361; 对应 -----ũ-----&#362; 对应 -----Ū-----&#363; 对应 -----ū-----&#364; 对应 -----Ŭ-----&#365; 对应 -----ŭ-----&#366; 对应 -----Ů-----&#367; 对应 -----ů-----&#368; 对应 -----Ű-----&#369; 对应 -----ű-----&#370; 对应 -----Ų-----&#371; 对应 -----ų-----&#372; 对应 -----Ŵ-----&#373; 对应 -----ŵ-----&#374; 对应 -----Ŷ-----&#375; 对应 -----ŷ-----&#376; 对应 -----Ÿ-----&#377; 对应 -----Ź-----&#378; 对应 -----ź-----&#379; 对应 -----Ż-----&#380; 对应 -----ż-----&#381; 对应 -----Ž-----&#382; 对应 -----ž-----⽂章出处:/itshare_205.html。

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详解

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文件的方法在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)

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解析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 }。

android三个特殊的资源目录resxmlresraw和assets

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格式字符串时,我们需要解析其中的标签数据,才能获取其中的内容。

下面是几种解析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字符串时报“前言中不允许有内容”错误。

解析xml字符串时报“前⾔中不允许有内容”错误。

⼀,问题出现经过:
j基于java语⾔webservic服务端接收客户端传来的xml字符串⽤解析时总
报:org.dom4j.DocumentException: Error on line 1 of document : 前⾔中不允许有内容。

Nested exception: 前⾔中不允许有内容。

xml字符串格式为:
⼆,问题原因:
通过图⽚可发现,XML⽂件格式、内容都没有错误,百度问题原因都说是编码问题,
经过排查问题发现xml中指定的编码格式为utf-8,⽽客户端给传过来的数据格式却是gbk格式
三,解决⽅式:
将该xml字符串重新编码,new String(text.getBytes("gbk"),"utf-8");再解析则问题解除
四,反思:
此处是解析xml字符串,解析xml⽂件同理,如果⽂件格式和⽂件内指定编码不⼀致时也会报此类型错误,此时只需要⽤类似notepad++⼯具把⽂件类型统⼀即可。

另外执⾏ant编译的程序时,如直接在编译后的程序中修改配置xml⽂件时执⾏时,也见过报这种错误,只需要重新编译⼀下改配置xml⽂件则错误消失,这种情况不是很常见,在这⾥记录⼀下。

解析字符串的方式

解析字符串的方式

解析字符串的方式摘要:1.字符串解析的基本概念2.字符串解析的方法和工具3.常见字符串解析工具的优缺点4.如何选择合适的字符串解析工具5.实际应用案例正文:字符串解析是计算机科学中一个常见的任务,它指的是将一个字符串转换为某种数据结构,例如数字、布尔值、列表、字典等等。

在实际应用中,字符串解析常常用于从文本文件中读取数据、解析配置文件、处理用户输入等等。

有多种方法和工具可以用于字符串解析,其中最常用的包括正则表达式、字符串匹配、XML 解析、JSON 解析等等。

这些方法和工具各有优缺点,需要根据具体应用场景选择合适的方法和工具。

正则表达式是一种强大的字符串匹配工具,可以用于查找、替换、分割字符串等等。

正则表达式的优点在于语法简单、易于使用,并且可以灵活地应对各种复杂的字符串处理需求。

但是,正则表达式也有一些局限性,例如对于复杂的语言规则难以处理,同时匹配效率较低。

字符串匹配是一种基于模式匹配的技术,可以用于查找字符串中特定的子串。

字符串匹配的优点在于速度较快,可以应对大规模文本处理的需求。

但是,字符串匹配也有一些局限性,例如对于复杂的语言规则难以处理,同时需要预先定义匹配模式。

XML 和JSON 是两种常用的数据格式,都有自己的解析方法。

XML 解析可以使用DOM、SAX、Pull 等方式,其中DOM 解析可以获得完整的XML 树结构,但是效率较低;SAX 解析和Pull 解析效率较高,但是只能获得XML 文档的线性流。

JSON 解析则可以使用JavaScript 对象或者JSON 库进行解析,具有较好的性能和易用性。

在选择字符串解析工具时,需要根据具体应用场景综合考虑。

如果需要处理大规模文本,那么可以选择字符串匹配或者JSON 解析;如果需要处理复杂的语言规则,那么可以选择正则表达式或者XML 解析。

同时,还需要考虑易用性、可维护性、稳定性等因素,选择合适的方法和工具。

在实际应用中,字符串解析常常需要与其他任务结合使用,例如数据存储、数据分析、机器学习等等。

Dom4J、JDOM、DOM、SAX和Pull技术解析XML文件

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语法中的某部分,如果符合就会触发事件。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

这个是主类:
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 ;
}
}。

相关文档
最新文档