【问题标题】:XmlPullParser getAttributeValue always returns nullXmlPullParser getAttributeValue 总是返回 null
【发布时间】:2015-07-31 13:37:35
【问题描述】:

我正在尝试解析一个 xml 文件。但是方法 getAttributeValue 总是为我返回 null。首先是xml文件

<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

这是我的代码。我正在使用AsyncTask

 public class XmlParser extends AsyncTask<Void, Void, String> {

        private XmlPullParserFactory xmlFactoryObject;
        private XmlPullParser myParser;
        private File file;
        FileInputStream fis;

        String value;

        public XmlParser() {
            try {
                xmlFactoryObject = XmlPullParserFactory.newInstance();
                myParser = xmlFactoryObject.newPullParser();

            } catch (XmlPullParserException e) {
                e.printStackTrace();
            }
        }

        public void setFile(File file1) {
            file = file1;
            execute();
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            try {
                if(file == null){
                    Toast.makeText(getActivity(), "NULL", Toast.LENGTH_LONG).show();
                }else{
                    Toast.makeText(getActivity(), "NOT NULL " + file.getName(), Toast.LENGTH_LONG).show();
                    fis = new FileInputStream(file);
                    myParser.setInput(fis, null);
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (XmlPullParserException e) {
                e.printStackTrace();
            }
        }

        @Override
        protected String doInBackground(Void... params) {
            int event = 0;
            try {
                event = myParser.getEventType();
            } catch (XmlPullParserException e) {
                e.printStackTrace();
            }
            while (event != XmlPullParser.END_DOCUMENT) {
                String name=myParser.getName();
                switch (event){
                    case XmlPullParser.START_TAG:
                        break;

                    case XmlPullParser.END_TAG:
                        if(name.equals("from")){
                            value = myParser.getAttributeValue(null, "value"); // this line always return null
                            Log.d(getTag(), "NEZINAU " + value);
                        }
                        break;
                }
                try {
                    event = myParser.next();
                } catch (XmlPullParserException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    Log.d(getTag(), "BAD " + e.getLocalizedMessage());
                }
            }
            return value;
        }

        @Override
        protected void onPostExecute(String aVoid) {
            super.onPostExecute(aVoid);
            System.out.println("myEND " + aVoid);
            Toast.makeText(getActivity(), "THE END!!! " + value, Toast.LENGTH_LONG).show();
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

这一行value = myParser.getAttributeValue(null, "value"); // this line always return null 总是返回空值。为什么?

【问题讨论】:

  • value = myParser.getAttributeValue(null, "from");你试过了吗?
  • 是的,但仍然返回null
  • 实际上如果&lt;from value="Jani"/&gt; 那么只有value = myParser.getAttributeValue(null, "value"); 会返回值= Jani。

标签: java android xml parsing android-xmlpullparser


【解决方案1】:

XML 中的属性如下所示:

<Tag attribute="value">content</Tag>

XML 文档中的标签没有属性。您想使用xmlPullParser.getText() 来获取开始和结束标记之间的文本内容。

【讨论】:

    【解决方案2】:

    您必须在事件 XmlPullParser.TEXT 上使用 XmlPullParser.getText() 检索值。 请参见此处的示例: http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html

    试试这样的:

        String currentName = "";
        while (event != XmlPullParser.END_DOCUMENT) {
            String name=myParser.getName();
            switch (event){
                case XmlPullParser.START_TAG:
                    currentName = name;
                    break;
                case XmlPullParser.TEXT:
                    if("from".equals(currentName)){
                        value = myParser.getText(); 
    
                        Log.d(getTag(), "NEZINAU " + value);                        
                        }
    
                    break;
    
    
                case XmlPullParser.END_TAG:
                    break;
            }
    

    【讨论】:

    • 谢谢,但此后我的程序崩溃了。
    • 哪一行程序崩溃了?
    • 我得到异常 if(name.equals("from")) 我认为不知何故名称变为 null Caused by: java.lang.NullPointerException at carproject.hfad.com.carproject.UiFragment$XmlParser.doInBackground(UiFragment.java:340) at carproject.hfad.com.carproject.UiFragment$XmlParser.doInBackground(UiFragment.java:281)
    • 例如我写了 if("from".equals(currentName)).这将在 equals() 的右侧正确处理“null”。并且您必须记住事件 XmlPullParser.START_TAG 上的名称,然后在 XmlPullParser.TEXT 上使用它
    • 谢谢!现在一切正常。您还需要添加这一行event = myParser.next();
    猜你喜欢
    • 2013-12-11
    • 2016-10-22
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 2014-03-04
    • 2016-11-02
    • 2014-05-06
    • 2012-06-05
    相关资源
    最近更新 更多