0

私のプロジェクトで助けが必要です。次のような XML 応答を返す Web サービスがあります。

  <ads>
    <id>6</id>
    <lnk>http://www.nkahtani.com/</lnk>
  </ads>

私は SAXParser を使用して要素を解析します。これが私のコードです

AdvParser.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;
}

 }
  }

AdvList.java

 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);
}
  }

そしてこれは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();
       }
   }

コードに例外はありませんが、問題は結果が得られず、パーサーが最初のタグ (ads) のみを解析し、他のタグ (id、lnk) を読み取らなかったことです。私はそれを解決する方法

ありがとう

4

1 に答える 1

0

しばらく前に同様の問題に遭遇しました。私にとってうまくいったのは、すべてのタグに別のブール値を使用し、すべてのタグ値に別の 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;
                   }
             }
       }

お役に立てれば。

于 2013-08-12T11:54:40.283 に答える