前端之家收集整理的这篇文章主要介绍了
使用pull解析器操作xml文件,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
一、使用Pull解析器读取XML文件
除了可以使用SAX或DOM解析XML文件之外,大家也可以使用Android内置的Pull解析器解析XML文件。@H_502_4@Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE。如果用在javaEE需要把其jar文件放入类路径中,因为Android已经集成进了Pull解析器,所以无需添加任何jar文件。android系统本身使用到的各种xml文件,其内部也是采用Pull解析器进行解析的。 Pull解析器的运行方式与SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值
二、使用Pull解析器生成XML文件
有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中;或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,这里推荐大家使用Pull解析器。@H_502_4@
使用Pull解析器生成一个与ljq.xml文件内容相同的myljq.xml文件,代码在本页下方备注
使用代码如下(生成XML文件):
File xmlFile = new File("myljq.xml");
FileOutputStream outStream = new FileOutputStream(xmlFile);
OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream,"UTF-8");
BufferedWriter writer = new BufferedWriter(outStreamWriter);
writeXML(persons,writer);
writer.flush();
writer.close();
如果只想得到生成的xml字符串内容,可以使用StringWriter:
StringWriter writer = new StringWriter();
String content = writer.toString();@H_502_4@
案例:
123.xml
PullPersonService pull解析器操作类
package@H_
502_4@
com.ljq.service; @H_502_4@
import@H_502_4@
java.io.InputStream; @H_502_4@
import@H_502_4@
java.io.Writer; @H_502_4@
import@H_502_4@
java.util.ArrayList; @H_502_4@
import@H_502_4@
java.util.List; @H_502_4@
import@H_502_4@
org.xmlpull.v1.XmlPullParser; @H_502_4@
import@H_502_4@
org.xmlpull.v1.XmlSerializer; @H_502_4@
import@H_502_4@
com.ljq.entity.Person; @H_502_4@
import@H_502_4@
android.util.Xml; @H_502_4@
/**@H_502_4@
* Pull解析xml文件 * * @H_502_4@
@author@H_502_4@
jiqinlin * @H_502_4@
*/@H_502_4@
@H_502_4@
public@H_502_4@
@H_502_4@
class@H_502_4@
PullPersonService { @H_502_4@
* 使用pull解析器生成xml文件 * * @H_502_4@
@param@H_502_4@
persons * @H_502_4@
writer * @H_502_4@
@return@H_502_4@
@H_502_4@
static@H_502_4@
String writeXML(List@H_502_4@
<@H_502_4@
Person@H_502_4@
>@H_502_4@
persons,Writer writer){ XmlSerializer serializer @H_502_4@
=@H_502_4@
Xml.newSerializer(); @H_502_4@
try@H_502_4@
{ serializer.setOutput(writer); serializer.startDocument(@H_502_4@
"@H_502_4@
UTF-8@H_502_4@
"@H_502_4@
,@H_502_4@
true@H_502_4@
); @H_502_4@
//@H_502_4@
第一个参数为命名空间,如果不使用命名空间,可以设置为null@H_502_4@
@H_502_4@
serializer.startTag(@H_502_4@
""@H_502_4@
,@H_502_4@
"@H_502_4@
persons@H_502_4@
"@H_502_4@
); @H_502_4@
for@H_502_4@
(Person person : persons){ serializer.startTag(@H_502_4@
""@H_502_4@
,@H_502_4@
"@H_502_4@
person@H_502_4@
"@H_502_4@
); serializer.attribute(@H_502_4@
""@H_502_4@
,@H_502_4@
"@H_502_4@
id@H_502_4@
"@H_502_4@
,person.getId().toString()); serializer.startTag(@H_502_4@
""@H_502_4@
,@H_502_4@
"@H_502_4@
name@H_502_4@
"@H_502_4@
); serializer.text(person.getName()); serializer.endTag(@H_502_4@
""@H_502_4@
,@H_502_4@
"@H_502_4@
name@H_502_4@
"@H_502_4@
); serializer.startTag(@H_502_4@
""@H_502_4@
,@H_502_4@
"@H_502_4@
age@H_502_4@
"@H_502_4@
); serializer.text(person.getAge().toString()); serializer.endTag(@H_502_4@
""@H_502_4@
,@H_502_4@
"@H_502_4@
age@H_502_4@
"@H_502_4@
); serializer.endTag(@H_502_4@
""@H_502_4@
,@H_502_4@
"@H_502_4@
person@H_502_4@
"@H_502_4@
); } serializer.endTag(@H_502_4@
""@H_502_4@
,@H_502_4@
"@H_502_4@
persons@H_502_4@
"@H_502_4@
); serializer.endDocument(); } @H_502_4@
catch@H_502_4@
(Exception e) { e.printStackTrace(); } @H_502_4@
return@H_502_4@
writer.toString(); } @H_502_4@
* 使用pull解析器解析xml文件 * * @H_502_4@
inStream * @H_502_4@
* @H_502_4@
@throws@H_502_4@
Exception @H_502_4@
static@H_502_4@
List@H_502_4@
<@H_502_4@
Person@H_502_4@
>@H_502_4@
readXML(InputStream inStream) @H_502_4@
throws@H_502_4@
Exception { XmlPullParser parser @H_502_4@
=@H_502_4@
Xml.newPullParser(); parser.setInput(inStream,@H_502_4@
"@H_502_4@
UTF-8@H_502_4@
"@H_502_4@
); @H_502_4@
int@H_502_4@
eventType @H_502_4@
=@H_502_4@
parser.getEventType(); Person currentPerson @H_502_4@
=@H_502_4@
@H_502_4@
null@H_502_4@
; List@H_502_4@
<@H_502_4@
Person@H_502_4@
>@H_502_4@
persons @H_502_4@
=@H_502_4@
@H_502_4@
null@H_502_4@
; @H_502_4@
while@H_502_4@
(eventType @H_502_4@
!=@H_502_4@
XmlPullParser.END_DOCUMENT) { @H_502_4@
switch@H_502_4@
(eventType) { @H_502_4@
case@H_502_4@
XmlPullParser.START_DOCUMENT:@H_502_4@
文档开始事件,可以进行数据初始化处理@H_502_4@
@H_502_4@
persons @H_502_4@
=@H_502_4@
@H_502_4@
new@H_502_4@
ArrayList@H_502_4@
<@H_502_4@
Person@H_502_4@
>@H_502_4@
(); @H_502_4@
break@H_502_4@
; @H_502_4@
case@H_502_4@
XmlPullParser.START_TAG:@H_502_4@
开始元素事件@H_502_4@
@H_502_4@
String name @H_502_4@
=@H_502_4@
parser.getName(); @H_502_4@
if@H_502_4@
(name.equalsIgnoreCase(@H_502_4@
"@H_502_4@
person@H_502_4@
"@H_502_4@
)) { currentPerson @H_502_4@
=@H_502_4@
@H_502_4@
new@H_502_4@
Person(); currentPerson.setId(@H_502_4@
new@H_502_4@
Integer(parser.getAttributeValue(@H_502_4@
null@H_502_4@
,@H_502_4@
"@H_502_4@
id@H_502_4@
"@H_502_4@
))); } @H_502_4@
else@H_502_4@
@H_502_4@
if@H_502_4@
(currentPerson @H_502_4@
!=@H_502_4@
@H_502_4@
null@H_502_4@
) { @H_502_4@
if@H_502_4@
(name.equalsIgnoreCase(@H_502_4@
"@H_502_4@
name@H_502_4@
"@H_502_4@
)) { currentPerson.setName(parser.nextText());@H_502_4@
如果后面是Text元素,即返回它的值@H_502_4@
@H_502_4@
} @H_502_4@
if@H_502_4@
(name.equalsIgnoreCase(@H_502_4@
"@H_502_4@
age@H_502_4@
"@H_502_4@
)) { currentPerson.setAge(@H_502_4@
new@H_502_4@
Short(parser.nextText())); } } @H_502_4@
case@H_502_4@
XmlPullParser.END_TAG:@H_502_4@
结束元素事件@H_502_4@
@H_502_4@
@H_502_4@
if@H_502_4@
(parser.getName().equalsIgnoreCase(@H_502_4@
"@H_502_4@
person@H_502_4@
"@H_502_4@
)@H_502_4@
&&@H_502_4@
currentPerson @H_502_4@
!=@H_502_4@
@H_502_4@
null@H_502_4@
) { persons.add(currentPerson); currentPerson @H_502_4@
=@H_502_4@
@H_502_4@
null@H_502_4@
; } @H_502_4@
break@H_502_4@
; } eventType @H_502_4@
=@H_502_4@
parser.next(); } inStream.close(); @H_502_4@
return@H_502_4@
persons; } }@H_502_4@