2012-06-12 113 views
0

我寫了這個代碼來解析這個XML:應用程序不工作,不幸的是,XML已經停止錯誤

http://hiscentral.cuahsi.org/webservices/hiscentral.asmx/GetSeriesCatalogForBox2

但是當我運行它...它說:「APP停止工作」,我可以找出原因...請幫忙!

的代碼是:

xmlActivity.java

package com.example.xml; 

public class XmlActivity extends ListActivity { 
    static final String URL = "http://hiscentral.cuahsi.org/webservices/hiscentral.asmx/GetSeriesCatalogForBox2"; 
    // XML node keys 
    static final String KEY_SeriesRecord = "SeriesRecord"; // parent node 
    static final String KEY_latitude = "latitude"; 
    static final String KEY_longitude = "longitude"; 
    static final String KEY_location = "location"; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>(); 

     XMLParser parser = new XMLParser(); 
     String xml = parser.getXmlFromUrl(URL); // getting XML 
     Document doc = parser.getDomElement(xml); // getting DOM element 

     NodeList nl = doc.getElementsByTagName(KEY_SeriesRecord); 

     // looping through all item nodes <item> 
     for (int i = 0; i < nl.getLength(); i++) { 
      // creating new HashMap 
      HashMap<String, String> map = new HashMap<String, String>(); 

      Element e = (Element) nl.item(i); 
      // adding each child node to HashMap key => value 
      map.put(KEY_SeriesRecord, parser.getValue(e, KEY_SeriesRecord)); 
      map.put(KEY_latitude, parser.getValue(e, KEY_latitude)); 
      map.put(KEY_longitude, parser.getValue(e, KEY_longitude)); 
      map.put(KEY_location, parser.getValue(e, KEY_location)); 

      // adding HashList to ArrayList 
      menuItems.add(map); 
     } 
     ListAdapter adapter = new SimpleAdapter(this, menuItems, 
       R.layout.list_item, new String[] { KEY_latitude, KEY_longitude, 
         KEY_location }, new int[] { R.id.name, R.id.desciption, 
         R.id.cost }); 

     setListAdapter(adapter); 

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

     lv.setOnItemClickListener(new OnItemClickListener() { 

      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       // getting values from selected ListItem 
       String name = ((TextView) view.findViewById(R.id.name)) 
         .getText().toString(); 
       String cost = ((TextView) view.findViewById(R.id.cost)) 
         .getText().toString(); 
       String description = ((TextView) view 
         .findViewById(R.id.desciption)).getText().toString(); 

       // Starting new intent 
       Intent in = new Intent(getApplicationContext(), 
         SingleMenuItemActivity.class); 
       in.putExtra(KEY_latitude, name); 
       in.putExtra(KEY_longitude, cost); 
       in.putExtra(KEY_location, description); 
       startActivity(in); 

      } 
     }); 
    } 
} 

SingleMenuItemActivity.java

package com.example.xml; 

public class SingleMenuItemActivity extends Activity { 

    // XML node keys 
    static final String KEY_latitude = "latitude"; 
    static final String KEY_longitude = "longitude"; 
    static final String KEY_location = "location "; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.single_list_item); 

     // getting intent data 
     Intent in = getIntent(); 

     // Get XML values from previous intent 
     String latitude = in.getStringExtra(KEY_latitude); 
     String longitude = in.getStringExtra(KEY_longitude); 
     String location = in.getStringExtra(KEY_location); 

     // Displaying all values on the screen 
     TextView lblName = (TextView) findViewById(R.id.name_label); 
     TextView lblCost = (TextView) findViewById(R.id.cost_label); 
     TextView lblDesc = (TextView) findViewById(R.id.description_label); 

     lblName.setText(latitude); 
     lblCost.setText(longitude); 
     lblDesc.setText(location); 
    } 
} 

xmlParser.java

package com.example.xml; 

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)); 
      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)); 
    } 
} 
+0

請加上'Logcat'輸出你的錯誤:異常堆棧跟蹤等 –

回答

0

您不能在活動線程中像HttpRequest一樣執行緩慢的操作。你必須把它們放在一個單獨的線程(AsyncTask)中。這是谷歌提到的,但我失去了源,我很抱歉。

你應該試着在這裏創建的AsyncTask是你應該如何努力:

public class GetSoigneurInfoTask extends AsyncTask<Document, Integer, Document>     //Le même code s'applique pour presque tout sauf onPostExecute() 
{ 
    Document doc; 
    String xml; 
    String url; 

    public GetSoigneurInfoTask(String URL) 
    { 
     url = URL; 
    } 

    protected Document doInBackground(Document...params) 
    { 
     xml = XmlFunctions.getXML(url);               
     doc = XmlFunctions.XMLfromString(xml); 
     return doc; 
    } 

    protected void onPostExecute(Document result) 
    { 
      if(result != null) 
     { 
      NodeList nodeList = doc.getElementsByTagName("RootTag");        //Crée une liste avec les elements sous soigneur 
      for (int i = 0; i < nodeList.getLength(); i++) 
      { 
       Node node = nodeList.item(i); 
       if (node.getNodeType() == Node.ELEMENT_NODE) 
       { 
        Element element = (Element) node; 
        NodeList nodelist = element.getElementsByTagName("childTag"); 
        Element element1 = (Element) nodelist.item(0); 
        NodeList fstNm = element1.getChildNodes(); 
        soignTemp = fstNm.item(0).getNodeValue(); 

       } 
      } 
     } 
    } 

所以你打電話給你的doInBackground()方法和你做,你有onPostExecute()與UI做的一切!

希望這會有所幫助!

+0

我不能夠讓你什麼意思 我在做此操作「你不能在活動主題做緩慢的操作類似的HttpRequest」在另一個網址,它工作正常,並仍在工作,但不在這個網址 –

+0

在這裏我發現了[鏈接](http://android-developers.blogspot.ca/2010/12/new-gingerbread-api-strictmode。 html) –

+0

當我嘗試在瀏覽器中打開您的網址時,它會顯示:Missing parameter:xmin。 –

相關問題