首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android从xml获取属性值

Android从xml获取属性值
EN

Stack Overflow用户
提问于 2017-10-02 02:24:12
回答 1查看 802关注 0票数 0

我正在尝试制作一个应用程序,它使用last.fm的web API,发送一个类似艺术家的查询,并返回所有相似艺术家的名字。似乎我设法正确地连接并获得了xml响应。但是,我不能提取name-attribute的值。我正在使用artistName = xmlData.getAttributeValue(null, "name");,但它提供的所有内容都是空的。

代码语言:javascript
复制
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import java.util.*;

@SuppressWarnings("FieldCanBeLocal")
public class MainActivity extends Activity implements Observer {
    private final String INPUTERROR = "Invalid/missing artist name.";
    private NetworkCommunication nc;
    private ArrayList<String> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        nc = new NetworkCommunication();
        nc.register(this);
        list = new ArrayList<>();

        ListView lv = (ListView)findViewById(R.id.ListView_similarArtistsList);
        ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, list);
        lv.setAdapter(adapter);
    }

    public void searchButton_Clicked(View v){
        EditText inputField = (EditText)findViewById(R.id.editText_artistName);
        String searchString = inputField.getText().toString();
        searchString = cleanSearchString(searchString);

        if(validateSearchString(searchString)){
            nc.setSearchString(searchString);
            nc.execute();
        }
        else{
            Toast.makeText(MainActivity.this, INPUTERROR, Toast.LENGTH_SHORT).show();
        }
    }

    private String cleanSearchString(String oldSearchString){
        String newString = oldSearchString.trim();
        newString = newString.replace(" ", "");

        return newString;
    }

    private boolean validateSearchString(String searchString){
        boolean rValue = true;

        if(TextUtils.isEmpty(searchString)){
            rValue = false;
        }

        return rValue;
    }

    @Override
    public void update(String artistName) {
        list.add(artistName);
    }
}

这是我的网络通信类:

代码语言:javascript
复制
import android.os.AsyncTask;
import android.util.Log;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;

@SuppressWarnings("FieldCanBeLocal")
class NetworkCommunication extends AsyncTask<Object, String, Integer> implements Subject {
    private final String MYAPIKEY = "--------------------------";
    private final String ROOT = "http://ws.audioscrobbler.com/2.0/";
    private final String METHOD = "?method=artist.getsimilar";
    private ArrayList<Observer> observers;
    private int amountOfArtists = 0;
    private String foundArtistName;
    private String searchString;

    NetworkCommunication(){
        observers = new ArrayList<>();
    }

    void setSearchString(String newSearchString){
        searchString = newSearchString;
    }

    private XmlPullParser sendRequest(){
        try{
            URL url = new URL(ROOT + METHOD + "&artist=" + searchString + "&api_key=" + MYAPIKEY);
            XmlPullParser receivedData = XmlPullParserFactory.newInstance().newPullParser();
            receivedData.setInput(url.openStream(), null);
            return receivedData;
        }
        catch (IOException | XmlPullParserException e){
            Log.e("ERROR", e.getMessage(), e);
        }

        return null;
    }

    private int tryProcessData(XmlPullParser xmlData){
        int artistsFound = 0;
        String artistName;
        int eventType;

        try{
            while ((eventType = xmlData.next()) != XmlPullParser.END_DOCUMENT) {

                if (eventType == XmlPullParser.START_TAG) {
                    if(xmlData.getName().equals("name")){
                        artistName = xmlData.getAttributeValue(null, "name");
                        publishProgress(artistName);
                        artistsFound++;
                    }
                }
            }
        }
        catch (IOException | XmlPullParserException e){
            Log.e("ERROR", e.getMessage(), e);
        }

        if (artistsFound == 0) {
            publishProgress();
        }

        return artistsFound;
    }

    @Override
    protected Integer doInBackground(Object... params) {
        XmlPullParser data = sendRequest();
        if(data != null){
            return tryProcessData(data);
        }
        else{
            return null;
        }
    }

    @Override
    protected void onProgressUpdate(String... values){
        /*
        if (values.length == 0) {
            //No data found...
        }
        */
        if (values.length == 1) {
            setFoundArtistName(values[0]);
            notifyObserver();
        }

        super.onProgressUpdate(values);
    }

    private void setFoundArtistName(String newArtistName){
        foundArtistName = newArtistName;
    }

    @Override
    public void register(Observer newObserver) {
        observers.add(newObserver);
    }

    @Override
    public void unregister(Observer deleteObserver) {
        observers.remove(deleteObserver);
    }

    @Override
    public void notifyObserver() {
        for (Observer o : observers) {
            Log.i("my tag.... ", "name = " + foundArtistName);
            o.update(foundArtistName);
        }
    }
}

以下是Google Chrome中的xml响应截图:

目前我唯一感兴趣的是提取Name元素的值。

我记录了foundArtistName的值(在方法notifyObserver中),它给了我很多"my tag…name = null etc“。

编辑:我尝试使用getText()而不是getAttributeValue(),但它也显示为空。

EN

回答 1

Stack Overflow用户

发布于 2017-10-02 14:27:02

我找到了解决方案。我使用的是:artistName = xmlData.getAttributeValue(null, "name");,而我真的应该使用:artistName = xmlData.nextText();

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46515491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档