[Android]关于使用Pull方式解析稍复杂的XML文件问题

__椎名真白 __椎名真白 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
大佬们晚上好,又是我。
这样的啊,我尝试了一下爱词霸的查词API,发现返回json数据和xml数据是不一样的。xml的数据要比json数据多了例句。
我解析过超简单的xml文件。但是这种复杂一点的完全没有头绪,弄了一天多,数据就是解析不正确。
这是内个XML文件的内容。
<?xml version="1.0" encoding="UTF-8"?>
<dict num="219" id="219" name="219">
<key>good</key>
<ps>g?d</ps>
<pron>http://res.iciba.com/resource/amp3/oxford/0/28/a2/28a24294fed307cf7e65361b8da4f6e5.mp3</pron>
<ps>ɡ?d</ps>
<pron>http://res.iciba.com/resource/amp3/1/0/75/5f/755f85c2723bb39381c7379a604160d8.mp3</pron>
<pos>adj.</pos>
<acceptation>好的;优秀的;有益的;漂亮的,健全的;
</acceptation>
<pos>n.</pos>
<acceptation>好处,利益;善良;善行;好人;
</acceptation>
<pos>adv.</pos>
<acceptation>同well;
</acceptation>
<sent>
<orig>
Best is the superlative form of good and worst is the superlative form of bad.
</orig>
<trans>
“best”是“good”的最高级形式,“worst” 是“bad”的最高级形式.
</trans>
</sent>
<sent>
<orig>
Good has captured the essence of the runaway, but does not pursue its most disturbing consequences.
</orig>
<trans>
Good抓住了这场失控的本质, 但没有进一步追踪这个事件最让人担忧的后果.
</trans>
</sent>
<sent>
<orig>
The state of the stream is revealed by the bad, fail, eof, and good operations.
</orig>
<trans>
流的状态由bad 、 fail 、 eof 和good操作提示.
</trans>
</sent>
<sent>
<orig>
Good Christian, good parent, good child, good wife, good husband.
</orig>
<trans>
虔诚的基督徒, 慈爱的父母, 孝顺的儿女, 贤良的妻子, 尽职的丈夫.
</trans>
</sent>
<sent>
<orig>
Good habits nurture good characters; good characters mold good fates.
</orig>
<trans>
好习惯育成好品格, 好品格塑造好命运.
</trans>
</sent>
</dict>

看着也不是很难。
然后我根据这个xml文件创建了一个JavaBean。如下:
package com.my.wordbar.bean;

import java.util.List;

public class JinshanEnglishToChineseBean {

private String query; //查询文本
private String enVoice; //英式发音
private String EnVoiceUrl; //英式发音地址
private String anVoice; //美式发音
private String anVoiceUrl; //美式发音地址

//因为发音为英、美两种,只要返回成功,一定会有两种发音。所以没有写成链表形式。

private List<MeanBean> meanList; //词性和解释列表
private List<Example> exampleList; //例句列表



private static class MeanBean{

private String type; //词性
private String mean; //解释

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

public String getMean() {
return mean;
}

public void setMean(String mean) {
this.mean = mean;
}
}

private static class Example{

private String chinese; //中文
private String english; //英文

public String getChinese() {
return chinese;
}

public void setChinese(String chinese) {
this.chinese = chinese;
}

public String getEnglish() {
return english;
}

public void setEnglish(String english) {
this.english = english;
}
}

public String getQuery() {
return query;
}

public void setQuery(String query) {
this.query = query;
}

public String getEnVoice() {
return enVoice;
}

public void setEnVoice(String enVoice) {
this.enVoice = enVoice;
}

public String getEnVoiceUrl() {
return EnVoiceUrl;
}

public void setEnVoiceUrl(String enVoiceUrl) {
EnVoiceUrl = enVoiceUrl;
}

public String getAnVoice() {
return anVoice;
}

public void setAnVoice(String anVoice) {
this.anVoice = anVoice;
}

public String getAnVoiceUrl() {
return anVoiceUrl;
}

public void setAnVoiceUrl(String anVoiceUrl) {
this.anVoiceUrl = anVoiceUrl;
}

public List<MeanBean> getMeanList() {
return meanList;
}

public void setMeanList(List<MeanBean> meanList) {
this.meanList = meanList;
}

public List<Example> getExampleList() {
return exampleList;
}

public void setExampleList(List<Example> exampleList) {
this.exampleList = exampleList;
}
}

就是getter和setter方法占地方,实际内容还是很少的。
然后开始发送网络请求,返回数据也是一点毛病没有。如下:

看这个数据是不是信心爆棚。。。然后问题就来了。。我把返回的数据字符串传入解析函数进行解析:
//使用pull方式解析XML文件
public void parseXMLWithPull(String result){

try {

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(result));
int eventType = xmlPullParser.getEventType();

JinshanEnglishToChineseBean e2cBean = new JinshanEnglishToChineseBean();

while(eventType != XmlPullParser.END_DOCUMENT){
String nodeName = xmlPullParser.getName();
switch(eventType){
//开始解析
case XmlPullParser.START_TAG:{
if("key".equals(nodeName)){
e2cBean.setQuery(xmlPullParser.nextText());
}else if("ps".equals(nodeName)){
e2cBean.setEnVoice(xmlPullParser.nextText());
}else if("pron".equals(nodeName)){
e2cBean.setEnVoiceUrl(xmlPullParser.nextText());
}else if("ps".equals(nodeName)){
e2cBean.setAnVoice(xmlPullParser.nextText());
}else if("pron".equals(nodeName)){
e2cBean.setAnVoiceUrl(xmlPullParser.nextText());
}

//剩下的没写,解析出来的都是错的
break;
}
default:
break;
}
eventType = xmlPullParser.next();
}

TextView responseText = (TextView) findViewById(R.id.response);
responseText.setText(e2cBean.getQuery() + "---" + e2cBean.getEnVoice() + "---" + e2cBean.getEnVoiceUrl()
+ "---" + e2cBean.getAnVoice() + "---" + e2cBean.getAnVoiceUrl());

}catch(Exception e){
e.printStackTrace();
Log.d(TAG, "解析过程中出错!!!");
}

}

然后解析结果就这样了:

第二个发音和发音地址都是空的。我解析过下面的数据,解析不出来。我不知道怎么写才是正确的。
如果按照这种方式解析XML,该怎么写才是正确的。
希望大佬们不吝赐教,多看两眼,给凡人指明一条通往希望的光明道路。
给出具体解决方案,或者具体代码都可以。我还有xml数据要解析。现在没有方法。好气啊。网上的解析方法都是解析的超简单的xml数据,我上我也行啊。。。大佬们。小迷弟已经找不到人生方向了。。
...全文

相关推荐

Android中使用PULL方式解析XML文件深入介绍

一、基本介绍 Android中极力推荐xmlpull方式解析xml。 xmlpull不仅可用在Android上同样也适用于javase,但在javase环境中需自己获取xmlpull所依赖的类库,kxml2-2.3.0.jar,xmlpull_1_1_3_4c.jar。 jar包下载网址 http://www.xmlpull.org/ http://kxml.sourceforge.net/ 二、例子 读取到xml的声明返回数字0 START_DOCUMENT; 读取到xml的结束返回数字1 END_DOCUMENT ; 读取到xml的开始标签返回数字2 START_TAG 读取到xml的结束

weixin_38507208

使用Pull解析器的XML工具类设计与实现

XML(可扩展标记语言)是一种用于描述数据的标记语言,它允许开发者定义自己的标签,以便创建结构化的文档。XML在数据交换、配置文件和界面描述中广泛应用,其可读性和可扩展性使之成为理想的数据交换格式。

爱军习武

Android XML解析实战:SAX、DOM与Pull详解

SAX解析的核心在于“事件驱动”(Event-driven)。它不像DOM解析那样一次性将整个XML文档加载到内存中,而是逐行读取XML内容,当解析器遇到特定的结构(如开始标签、结束标签、文本内容等)时,会触发相应的回调事件。这些事件包括::文档开始解析时触发。:文档解析结束时触发。:遇到开始标签时触发。:遇到结束标签时触发。:读取到文本内容时触发。这些事件的处理由开发者自定义的子类来完成。通过重写这些方法,可以实现对XML数据的动态解析与处理。

滚菩提哦呢

安卓项目源码AndroidReadXmlByPull使用Pull解析Xml文件

安卓项目源码Android ReadXmlByPull 使用Pull解析Xml文件

zz_ll9023

Android解析xml文件的3种方式

android解析XML的3种方式!详细介绍!你懂得!下载有惊喜噢!

oppoulike
评论 6
收藏 已收藏
分享
返回顶部
__椎名真白
Android 80,489 成员 91,375 内容