SAXParser与android
我的项目需要帮助,我有一个web服务,它返回如下XML响应:SAXParser与android,android,xml-parsing,saxparser,Android,Xml Parsing,Saxparser,我的项目需要帮助,我有一个web服务,它返回如下XML响应: <ads> <id>6</id> <lnk>http://www.nkahtani.com/</lnk> </ads> AdvList.java public class AdvParser extends DefaultHandler{ String elementValue = null; Boolean elementOn
<ads>
<id>6</id>
<lnk>http://www.nkahtani.com/</lnk>
</ads>
AdvList.java
public class AdvParser extends DefaultHandler{
String elementValue = null;
Boolean elementOn = false;
public static AdvList sitesList = null;
public static AdvList getSitesList() {
return sitesList;
}
public static void setSitesList(AdvList sitesList) {
AdvParser.sitesList = sitesList;
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
elementOn=true;
if (localName.equals("ads"))
{
sitesList = new AdvList();
} else if (localName.equals("id")) {
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
elementOn = false;
/**
* Sets the values after retrieving the values from the XML tags
* */
if (localName.equalsIgnoreCase("id"))
sitesList.setId(elementValue);
else if (localName.equalsIgnoreCase("lnk"))
sitesList.setLink(elementValue);
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
if (elementOn) {
elementValue = new String(ch, start, length);
Log.i("XMLParser", elementValue);
elementOn = false;
}
}
}
public class AdvList {
private ArrayList<String> link = new ArrayList<String>();
private ArrayList<String> id = new ArrayList<String>();
public ArrayList<String> getLink() {
return link;
}
public void setLink( String link) {
this.link .add(link);
}
public ArrayList<String> getId() {
return id;
}
public void setId(String id) {
this.id .add(id);
}
}
公共类AdvList{
private ArrayList link=new ArrayList();
private ArrayList id=new ArrayList();
公共阵列列表getLink(){
返回链接;
}
公共无效设置链接(字符串链接){
this.link.add(link);
}
公共ArrayList getId(){
返回id;
}
公共无效集合id(字符串id){
此.id.add(id);
}
}
这将调用URL
public class RegisterTask extends AsyncTask<Void, Integer, String> {
ProgressDialog dialog;
protected String doInBackground(Void... N) {
publishProgress(0);
try {
//Result = LoginRequest();
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
XMLReader xmlReader=saxParser.getXMLReader();
AdvParser handler = new AdvParser();
xmlReader.setContentHandler(handler);
URL url = new URL("http://82.192.79.39:9000/api/ads/get");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
is = connection.getInputStream();
xmlReader.parse(new InputSource(is));
//saxParser.parse(is, handler);
//Log.i("Pars", handler.getNameAtt() +" "+handler.getNameAtt());
// TODO Auto-generated catch block
return "hi";
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
@Override
protected void onProgressUpdate(Integer... progress) {
if(progress[0] == 0)
{
dialog = ProgressDialog.show(SplashScreen.this, "Please wait",
"Login ,Please wait.", true);
super.onProgressUpdate(progress);
}
}
protected void onPostExecute(InputStream result) {
dialog.dismiss();
}
}
公共类寄存器任务扩展异步任务{
进程对话;
受保护字符串DOIN背景(无效…N){
出版进度(0);
试一试{
//结果=LoginRequest();
SAXParserFactory=SAXParserFactory.newInstance();
SAXParser SAXParser=factory.newSAXParser();
XMLReader=saxParser.getXMLReader();
AdvParser handler=新的AdvParser();
setContentHandler(handler);
URL=新URL(“http://82.192.79.39:9000/api/ads/get");
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.setRequestMethod(“POST”);
is=connection.getInputStream();
parse(新的InputSource(is));
//parse(is,handler);
//Log.i(“Pars”,handler.getNameAtt()+“”+handler.getNameAtt());
//TODO自动生成的捕捉块
返回“hi”;
}
捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
返回null;
}
}
@凌驾
受保护的void onProgressUpdate(整数…进度){
如果(进度[0]==0)
{
dialog=ProgressDialog.show(SplashScreen.this,“请稍候”,
“登录,请稍候。”,对);
super.onProgressUpdate(进度);
}
}
受保护的void onPostExecute(InputStream结果){
dialog.dismise();
}
}
我的代码中没有任何异常,但问题是我没有得到任何结果,解析器只解析第一个标记(ads),没有读取其他标记(id,lnk)
有人能告诉我怎么解决吗
感谢不久前我遇到了一个类似的问题,对我有效的是我对所有标记使用了不同的布尔值,对所有标记值使用了不同的StringBuilder。下面是对处理程序的一些小修改
public static final String ID = "id";
public static final String LINK = "lnk";
Boolean bool_id, bool_link,flag;
StringBuilder out_id,out_link;
Boolean elementOn = false;
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (localName.equalsIgnoreCase("ads")) {
flag = true;
}
if (flag) {
if (localName.equalsIgnoreCase(ID)) {
out_id= new StringBuilder();
elementOn = true;
bool_id= true;
} else if (localName.equalsIgnoreCase(LINK)) {
out_link = new StringBuilder();
elementOn = true;
bool_link = true;
}
}
}
public void characters(char[] ch, int start, int length)
throws SAXException {
if (elementOn) {
if (bool_id)
out_id.append(new String(ch, start, start + length));
else if (bool_link)
out_link.append(new String(ch, start, start + length));
}
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (elementOn) {
elementOn = false;
if (localName.equalsIgnoreCase(ID)) {
sitesList.setId(out_id.toString());
bool_id = false;
} else if (localName.equalsIgnoreCase(LINK)) {
sitesList.setLink(out_link.toString());
bool_link= false;
}
}
}
希望这有帮助