如何解析ArrayList中的xml数据

时间:2016-09-09 14:44:02

标签: java android xml

我需要解析android中的xml数据。我见过这个项目:here from github讲授如何解析列表框中的xml数据。但是,我想将xml数据转换为不同的字符串。虽然,我使用了几乎与github项目相同的代码,但我只得到错误,应用程序停止响应。

代码:

public class Main extends Fragment {
    android.view.View myview;
    EditText number;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        myview = inflater.inflate(R.layout.fragment_screen, container, false);
        number = (EditText) myview.findViewById(R.id.number);
        XmlParser par = new XmlParser();
        number.setText(par.getStackSitesFromFile(getActivity().getBaseContext())
            .get(0).getLink()); **Error here**
        return myview;
    }
}

XmlParser.java

public class XmlParser {
    static final String KEY_SITE = "rate";

    static final String KEY_NAME = "Name";

    static final String KEY_LINK = "Rate";

    static final String KEY_ABOUT = "Date";

    static final String KEY_IMAGE_URL = "Time";



    public static List<HandleXML> getStackSitesFromFile(Context ctx) {
        // List of StackSites that we will return

        List<HandleXML> stackSites;

        stackSites = new ArrayList<HandleXML>();

        // temp holder for current StackSite while parsing

        HandleXML curStackSite = null;

        // temp holder for current text value while parsing

        String curText = "";
        try {

            // Get our factory and PullParser

            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();

            XmlPullParser xpp = factory.newPullParser();
            // Open up InputStream and Reader of our file.

            FileInputStream fis = ctx.openFileInput("/sdcard/rates.xml");

            BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
            // point the parser to our file.

            xpp.setInput(reader);
            // get initial eventType

            int eventType = xpp.getEventType();
            // Loop through pull events until we reach END_DOCUMENT

            while (eventType != XmlPullParser.END_DOCUMENT) {

                // Get the current tag

                String tagname = xpp.getName();
                // React to different event types appropriately

                switch (eventType) {

                case XmlPullParser.START_TAG:

                    if (tagname.equals("test")) {
                        curStackSite = new HandleXML();
                    }
                    break;
                case XmlPullParser.TEXT:
                    //grab the current text so we can use it in END_TAG event
                    curText = xpp.getText();
                    break;
                case XmlPullParser.END_TAG:
                    if (tagname.equalsIgnoreCase("test")) {
                        stackSites.add(curStackSite);
                    } else if (tagname.equalsIgnoreCase(KEY_NAME)) {
                        curStackSite.setName(curText);
                    } else if (tagname.equals("Rate")) {
                        curStackSite.setLink(curText);
                    } else if (tagname.equalsIgnoreCase(KEY_ABOUT)) {
                        curStackSite.setAbout(curText);
                    } else if (tagname.equalsIgnoreCase(KEY_IMAGE_URL)) {
                        curStackSite.setImgUrl(curText);
                    }
                    break;
                default:
                    break;
                }
                eventType = xpp.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


        // return the populated list.
        return stackSites;
    }
}

最后,HandleXml.java

public class HandleXML {
    private String name;
    private String rate;
    private String date;
    private String time;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLink() {
        return rate;
    }

    public void setLink(String rate) {
        this.rate = rate;
    }

    public String getAbout() {
        return date;
    }

    public void setAbout(String date) {
        this.date = date;
    }

    public String getImgUrl() {
        return time;
    }

    public void setImgUrl(String time) {
        this.time = time;
    }

    @Override
    public String toString() {
        return name + rate;
    }
}

Xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:count="1" yahoo:created="2016-09-07T05:50:08Z" yahoo:lang="en-US">
<results>
<test>
<Name>EUR/USD</Name>
<Rate>1.1251</Rate>
<Date>9/7/2016</Date>
<Time>0:56am</Time>
</test>
<test>
<Name>EUR/USD</Name>
<Rate>1.1253</Rate>
<Date>9/7/2016</Date>
<Time>0:56am</Time>
</test>
</results>
</query>

错误位于代码的第一个片段:number.setText(par.getStackSitesFromFile(getActivity().getBaseContext()).get(0).getLink());

1 个答案:

答案 0 :(得分:0)

arraylist返回为空,因为FileInputStream fis 设置为打开包含路径分隔符( / )的文件,并导致

  

java.lang.IllegalArgumentException:文件/sdcard/rates.xml包含路径分隔符

。你必须使用 而是FileInputStream fis = new FileInputStream (new File("/sdcard/rates.xml"));。不要忘记按fis.close();

关闭fis

XmlParser的最终代码为:

public class XmlParser {
static final String KEY_SITE = "rate";

static final String KEY_NAME = "Name";

static final String KEY_LINK = "Rate";

static final String KEY_ABOUT = "Date";

static final String KEY_IMAGE_URL = "Time";

FileInputStream fis;


public static List<HandleXML> getStackSitesFromFile() {
    // List of StackSites that we will return

    List<HandleXML> stackSites;

    stackSites = new ArrayList<HandleXML>();

    // temp holder for current StackSite while parsing

    HandleXML curStackSite = null;

    // temp holder for current text value while parsing

    String curText = "";
    try {

        // Get our factory and PullParser

        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();

        XmlPullParser xpp = factory.newPullParser();
        // Open up InputStream and Reader of our file.

        fis =  new FileInputStream(new File("/sdcard/rates.xml"));

        BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
        // point the parser to our file.

        xpp.setInput(reader);
        // get initial eventType

        int eventType = xpp.getEventType();
        // Loop through pull events until we reach END_DOCUMENT

        while (eventType != XmlPullParser.END_DOCUMENT) {

            // Get the current tag

            String tagname = xpp.getName();
            // React to different event types appropriately

            switch (eventType) {

            case XmlPullParser.START_TAG:

                if (tagname.equals("test")) {
                    curStackSite = new HandleXML();
                }
                break;
            case XmlPullParser.TEXT:
                //grab the current text so we can use it in END_TAG event
                curText = xpp.getText();
                break;
            case XmlPullParser.END_TAG:
                if (tagname.equalsIgnoreCase("test")) {
                    stackSites.add(curStackSite);
                } else if (tagname.equalsIgnoreCase(KEY_NAME)) {
                    curStackSite.setName(curText);
                } else if (tagname.equals("Rate")) {
                    curStackSite.setLink(curText);
                } else if (tagname.equalsIgnoreCase(KEY_ABOUT)) {
                    curStackSite.setAbout(curText);
                } else if (tagname.equalsIgnoreCase(KEY_IMAGE_URL)) {
                    curStackSite.setImgUrl(curText);
                }
                break;
            default:
                break;
            }
            eventType = xpp.next();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    try {
        fis.close();
    }catch(Exception e){
        Log.i("Problem closing", "Closing fis");
    }


    // return the populated list.
    return stackSites;
}
}

然后设置number.setText():number.setText(par.getStackSitesFromFile().get(0).getLink());