Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在ArrayList中解析xml数据_Java_Android_Xml - Fatal编程技术网

Java 如何在ArrayList中解析xml数据

Java 如何在ArrayList中解析xml数据,java,android,xml,Java,Android,Xml,我需要在android中解析xml数据。我看过这个项目:它教我们如何解析listbox中的xml数据。但是,我希望将xml数据转换为不同的字符串。虽然,我使用了与github项目中几乎相同的代码,但我只得到了错误,应用程序停止响应 代码: XmlParser.java public class XmlParser { static final String KEY_SITE = "rate"; static final String KEY_NAME = "Name";

我需要在android中解析xml数据。我看过这个项目:它教我们如何解析listbox中的xml数据。但是,我希望将xml数据转换为不同的字符串。虽然,我使用了与github项目中几乎相同的代码,但我只得到了错误,应用程序停止响应

代码:

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

欧元/美元
1.1251
9/7/2016
上午0:56
欧元/美元
1.1253
9/7/2016
上午0:56

错误出现在:
number.setText(par.getStackSitesFromFile(getActivity().getBaseContext()).get(0.getLink())中的第一段代码中

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

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

。你必须使用
FileInputStream fis=newfileinputstream(新文件(“/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;
}
}
公共类XmlParser{
静态最终字符串键\u SITE=“rate”;
静态最终字符串键\u NAME=“NAME”;
静态最终字符串键\u LINK=“Rate”;
静态最终字符串键\u ABOUT=“Date”;
静态最终字符串键\u IMAGE\u URL=“Time”;
文件输入流fis;
公共静态列表getStackSitesFromFile(){
//我们将返回的StackSites列表
列出地点;
stackSites=newarraylist();
//分析时当前StackSite的临时保持器
HandleXML curStackSite=null;
//分析时当前文本值的临时保持器
字符串curText=“”;
试一试{
//把我们的工厂和工厂弄来
XmlPullParserFactory工厂=XmlPullParserFactory.newInstance();
XmlPullParser xpp=factory.newPullParser();
//打开文件的输入流和读取器。
fis=新文件输入流(新文件(“/sdcard/rates.xml”);
BufferedReader reader=新的BufferedReader(新的InputStreamReader(fis));
//将解析器指向我们的文件。
设置输入(读卡器);
//获取初始事件类型
int eventType=xpp.getEventType();
//循环拉取事件,直到到达END_文档
while(eventType!=XmlPullParser.END_文档){
//获取当前标记
字符串标记名=xpp.getName();
//对不同的事件类型做出适当的反应
开关(事件类型){
case XmlPullParser.START_标记:
if(标记名.equals(“测试”)){
curStackSite=newhandlexml();
}
打破
case XmlPullParser.TEXT:
//抓取当前文本,以便我们可以在END_标记事件中使用它
curText=xpp.getText();
打破
case XmlPullParser.END_标记:
if(标记名.equalsIgnoreCase(“测试”)){
stackSites.add(curStackSite);
}else if(标记名.equalsIgnoreCase(键名)){
curStackSite.setName(curText);
}else if(标记名.equals(“Rate”)){
curStackSite.setLink(curText);
}else if(标记名.equalsIgnoreCase(键关于)){
curStackSite.setAbout(curText);
}else if(标记名.equalsIgnoreCase(键\图像\ URL)){
curStackSite.setImgUrl(curText);
}
打破
违约:
打破
}
eventType=xpp.next();
}
}捕获(例外e){
e、 printStackTrace();
}
试一试{
fis.close();
}捕获(例外e){
日志i(“问题关闭”、“关闭金融机构”);
}
//返回填充的列表。
返回站点;
}
}

然后像这样设置number.setText():
number.setText(par.getStackSitesFromFile().get(0.getLink())

错误是什么?我猜这是ArrayIndexOutOfBoundsException,如果是,这意味着您的列表是空的。我刚刚用您提供的XML文件测试了您的解析器,并且它在我这边按预期工作,我有一个包含两个HandleXML@NicolasFilotto确切地错误为:java.lang.IndexOutOfBoundsException:索引0无效,大小为0。这意味着您的列表为空,因此get(0)引发此异常,出于某种原因getStackSitesFromFile返回空列表。检查在尝试解析XML时是否出现异常file@NicolasFilotto当片段显示时,我立即得到异常(在onCreateView中设置number.setText())。我仍然无法理解为什么列表返回为空,以及我应该如何修复它。
<?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>
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;
}
}