解析xml文件时出现空点错误

时间:2013-12-26 08:59:00

标签: android xml

我尝试了一个解析和显示xml文件数据的例子,因此我遵循了parsexml教程。我用我自己的xml文件替换了这个xml文件,我存储在我的服务器上。我的xml文件是有效的,我通过加载我的chrome来检查这个。我的问题是在运行我的项目时它抛出一个错误,因为零点错误当我在xml文件附近调试我的应用程序时,它给出了找不到页面的错误。有了这个,我附上了我的logcat。任何人都可以告诉我为什么会收到此错误。我提到this但没有用。我的logcat是

12-26 02:34:20.230: E/Error:(1734): expected: /META read: HEAD (position:END_TAG </HEAD>@11:8 in java.io.StringReader@41829778) 
12-26 02:34:20.230: D/AndroidRuntime(1734): Shutting down VM
12-26 02:34:20.230: W/dalvikvm(1734): threadid=1: thread exiting with uncaught exception (group=0x414c4700)
12-26 02:34:20.240: E/AndroidRuntime(1734): FATAL EXCEPTION: main
12-26 02:34:20.240: E/AndroidRuntime(1734): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.testing.mypractise/com.practise.loadimagefromxml.AndroidXMLParsingActivity}: java.lang.NullPointerException
12-26 02:34:20.240: E/AndroidRuntime(1734):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
12-26 02:34:20.240: E/AndroidRuntime(1734):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
12-26 02:34:20.240: E/AndroidRuntime(1734):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
12-26 02:34:20.240: E/AndroidRuntime(1734):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
12-26 02:34:20.240: E/AndroidRuntime(1734):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-26 02:34:20.240: E/AndroidRuntime(1734):     at android.os.Looper.loop(Looper.java:137)
12-26 02:34:20.240: E/AndroidRuntime(1734):     at android.app.ActivityThread.main(ActivityThread.java:5103)
12-26 02:34:20.240: E/AndroidRuntime(1734):     at java.lang.reflect.Method.invokeNative(Native Method)
12-26 02:34:20.240: E/AndroidRuntime(1734):     at java.lang.reflect.Method.invoke(Method.java:525)
12-26 02:34:20.240: E/AndroidRuntime(1734):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
12-26 02:34:20.240: E/AndroidRuntime(1734):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-26 02:34:20.240: E/AndroidRuntime(1734):     at dalvik.system.NativeStart.main(Native Method)
12-26 02:34:20.240: E/AndroidRuntime(1734): Caused by: java.lang.NullPointerException
12-26 02:34:20.240: E/AndroidRuntime(1734):     at com.testing.mypractise.AndroidXMLParsingActivity.onCreate(AndroidXMLParsingActivity.java:55)
12-26 02:34:20.240: E/AndroidRuntime(1734):     at android.app.Activity.performCreate(Activity.java:5133)
12-26 02:34:20.240: E/AndroidRuntime(1734):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
12-26 02:34:20.240: E/AndroidRuntime(1734):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
12-26 02:34:20.240: E/AndroidRuntime(1734):     ... 11 more

AndroidXmlParsingActivity:

public class AndroidXMLParsingActivity extends ListActivity {

    // All static variables
    static final String URL = "http://....../.../Images/testing.xml";
    // XML node keys
    static final String KEY_ITEM = "item"; // parent node
    static final String KEY_CATEGORY = "category";
    static final String KEY_CHANNELNAME = "channelname";
    //Intent imgvw;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tv_main);

        ArrayList<HashMap<String, String>> channellist = new ArrayList<HashMap<String, String>>();

        XMLParser parser = new XMLParser();
        String xml = parser.getXmlFromUrl(URL); 
        Document doc = parser.getDomElement(xml); 

        **NodeList nl = doc.getElementsByTagName(KEY_ITEM);**  => this is 55th line

        for (int i = 0; i < nl.getLength(); i++) {

            HashMap<String, String> listmap = new HashMap<String, String>();
            Element e = (Element) nl.item(i);

            listmap.put(KEY_CATEGORY, parser.getValue(e, KEY_CATEGORY));
            listmap.put(KEY_CHANNELNAME, parser.getValue(e, KEY_CHANNELNAME));

            // adding HashList to ArrayList
            channellist.add(listmap);
        }

        // Adding menuItems to ListView
        ListAdapter adapter = new SimpleAdapter(this, channellist,
                R.layout.list_item,
                new String[] { KEY_CATEGORY, KEY_CHANNELNAME}, new int[] {
                        R.id.category, R.id.cahnnel_name});

        setListAdapter(adapter);

        // selecting single ListView item
        ListView lv = getListView();

        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // getting values from selected ListItem
                String category = ((TextView) view.findViewById(R.id.category)).getText().toString();
                String channelname = ((TextView) view.findViewById(R.id.cahnnel_name)).getText().toString();

                try {
                    ImageView imgvw = (ImageView) findViewById (R.id.image_logo);
                      Bitmap bitmap;
                    bitmap = BitmapFactory.decodeStream((InputStream)new URL("http://192.168.2.57:8080/Iptvtest/Images/bnews1.png").getContent());
                    imgvw.setImageBitmap(bitmap);
                } 
                catch (MalformedURLException e) 
                {

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

                    e.printStackTrace();
                }



                // Starting new intent
                Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
                in.putExtra(KEY_CATEGORY, category);
                in.putExtra(KEY_CHANNELNAME, channelname);
                //in.putExtras(imgvw);

                startActivity(in);

            }
        });
    }
}

在xmlparser类的getDomElement中遇到此错误:

public class XMLParser {

    // constructor
    public XMLParser() {

    }

    /**
     * Getting XML from URL making HTTP request
     * @param url string
     * */
    public String getXmlFromUrl(String url) {
        String xml = null;

        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            xml = EntityUtils.toString(httpEntity);

        } 
        catch (UnsupportedEncodingException e) 
        {
            e.printStackTrace();
        } 
        catch (ClientProtocolException e)
        {
            e.printStackTrace();
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
        // return XML
        return xml;
    }

    /**
     * Getting XML DOM element
     * @param XML string
     * */
    public Document getDomElement(String xml){
        Document doc = null;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {

            DocumentBuilder db = dbf.newDocumentBuilder();

            InputSource is = new InputSource();
                is.setCharacterStream(new StringReader(xml));  // error here.
                doc = db.parse(is); 

            } 
        catch (ParserConfigurationException e)
        {
                Log.e("Error: ", e.getMessage());
                return null;
            } 
        catch (SAXException e) 
        {
                Log.e("Error: ", e.getMessage());
                return null;
            } 
        catch (IOException e) 
        {
                Log.e("Error: ", e.getMessage());
                return null;
            }

            return doc;
    }

    /** Getting node value
      * @param elem element
      */
     public final String getElementValue( Node elem ) 
     {
         Node child;
         if( elem != null)
         {
             if (elem.hasChildNodes())
             {
                 for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() )
                 {
                     if( child.getNodeType() == Node.TEXT_NODE  )
                     {
                         return child.getNodeValue();
                     }
                 }
             }
         }
         return "";
     }      
     /**
      * Getting node value
      * @param Element node
      * @param key string
      * */
     public String getValue(Element item, String str) {     
            NodeList n = item.getElementsByTagName(str);        
            return this.getElementValue(n.item(0));
        }
}

,错误是

HTTP Error 405 - The HTTP verb used to access this page is not allowed.<br>Internet Information Services (IIS)

1 个答案:

答案 0 :(得分:1)

最后我解决了我的空指针异常错误和元读取错误。 而不是HTTPPost我声明HTTPGET。这解决了我的错误。原因是

托管该内容的HTTP应用程序期待其他东西 - 很可能是GET。 Apache HTTP Client有一个类 - HTTPGet ......很自然。至于两者的区别。那么主要区别在于GET方法将参数编码为URL的一部分(例如,您可能会注意到?apiAccessCode = api&amp; parameter2 = something),而POST将内容作为HTTP消息体的一部分。 HTTP GET也限制为256个字符。用例也是不同的。 HTTP GET应仅用于数据检索,HTTP Post可用于更新内容。

我的代码是

XMLParser:
    public String getXmlFromUrl(String url) {
        String xml = null;

        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();

            HttpGet httpget = new HttpGet (url);

            HttpResponse httpResponse = httpClient.execute(httpget); // here i changed my httppost to httpget.
            HttpEntity httpEntity = httpResponse.getEntity();
            xml = EntityUtils.toString(httpEntity);

        } 

希望这可能对某人有所帮助: - )