-1

重複の可能性:
Android アプリにデータを提供する xml API を作成する方法

私も以前にこれを尋ねましたが、今回はいくつかの調査を行い、私の問題に対する答えが得られなかったので戻ってきました。

Androidアプリに提供したいデータを含むdata.xmlファイルがあります。私はアンドロイドエンドのコーディングを行いましたが、完璧だと思います。しかし、データはファイルからアプリに取得されていません。私のファイル構造は次のようになります。

(a)data.xml (b)Main (c)HandlingXMLStuff (d)XMLDataCollected

(a)data.xml

<?xml version="1.0" encoding="utf-8"?>
  <document version="first">
    <stuff code="firststuff">
      <item1 build="first">This is first item.</item1>
      <item2 build="second">This is second item.</item2>
      <item3 build="third">This is third item.</item3>
    </stuff>
    <stuff code="secondtstuff">
      <item1 build="first">This is first item.</item1>
      <item2 build="second">This is second item.</item2>
      <item3 build="third">This is third item.</item3>
    </stuff>
    <stuff code="thirdstuff">
      <item1 build="first">This is first item.</item1>
      <item2 build="second">This is second item.</item2>
      <item3 build="third">This is third item.</item3>
    </stuff>
  </document>

(b)メイン

package com.xyz.xmlpar1;
import java.net.URL;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Main extends Activity implements OnClickListener {
  static final String BaseURL="http://www.xyz.com/data.xml?code=";
  Button b;
  TextView tv;
  EditText et1;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    et1=(EditText) findViewById(R.id.editText1);
    b=(Button) findViewById(R.id.button1);
    tv=(TextView) findViewById(R.id.textView1);
    b.setOnClickListener(this);
  }
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }
  @Override
  public void onClick(View v) {
    // TODO Auto-generated method stub
    String item=et1.getText().toString();
    StringBuilder URL=new StringBuilder(BaseURL);
    URL.append(item);
    String fullURL=URL.toString();
    try{
      URL website=new URL(fullURL);
      SAXParserFactory spf=SAXParserFactory.newInstance();
      SAXParser sp=spf.newSAXParser();
      XMLReader xr=sp.getXMLReader();
      HandlingXMLStuff doingWork=new HandlingXMLStuff();
      xr.setContentHandler(doingWork);
      xr.parse(new InputSource(website.openStream()));
      String information=doingWork.getInformation();
      tv.setText(information);
    }catch(Exception e){
      tv.setText("error");
    }
  }
}

(c)HandlingXMLStuff

package com.xyz.xmlpar1;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class HandlingXMLStuff extends DefaultHandler {
  XMLDataCollected info=new XMLDataCollected();
  public String getInformation(){
    return info.datatoString();
  }
  @Override
  public void startElement(String uri, String localName, String qName,
    Attributes attributes) throws SAXException {
    // TODO Auto-generated method stub
    if(localName.equals("code")){
      String element=attributes.getValue("build");
      info.setData(element);
    }
  }
}

(d)XMLDataCollected

package com.xyz.xmlpar1;
public class XMLDataCollected {
  String datac=null;
  public void setData(String c){
    datac=c;
  }
  public String datatoString(){
    return datac;
  }
}

したがって、first または second または third と入力すると、データが取得されます。しかし、そうではありません。私は何を間違っていますか?

4

1 に答える 1

0

問題はハンドラーにあるようです。関数を追加しているだけですがstartElement、実際には少なくともタグの開始と終了に対処する必要があります。

また、localName.equals("code")実際にタグの名前を探す必要があります。localName.equals("stuff")

ここに完全な例があります: http://www.mysamplecode.com/2011/11/android-parse-xml-file-example-using.htmlと、 http ://stackoverflow.comにたくさんの投稿があります。 SAX を使用した完全に機能するパーサー。

コードをデバッグして、実行時に実際に何が起こっているかを確認することをお勧めします。これを行うには、IDE でデバッグ モードを使用するか、いくつかのSystem.out.println()orLog.d()ステートメントをそこにスローします。

于 2013-01-19T19:27:25.177 に答える