2017-07-28 115 views
1

我的网络网络服务器正在返回一个XML。 我想在android应用程序中显示数据。Web服务器到android XML解析

如何继续?

我有一个SOAP类,它获取XML作为响应并返回响应。如何在列表视图中解析该响应?

public String getAllDetails() {  
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() 
      .permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
    // Create the envelop.Envelop will be used to send the request 
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
      SoapEnvelope.VER11); 
    envelope.setOutputSoapObject(request); 
    // Says that the soap webservice is a .Net service 
    envelope.dotNet = true; 
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
    String s = "";  
    androidHttpTransport.debug=true; 
    androidHttpTransport.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); 
    try { 
     androidHttpTransport.call(SOAP_ACTION, envelope); 
     SoapPrimitive response = (SoapPrimitive) envelope.getResponse(); 
     s = response.toString();   
     Log.d("Converter", response.toString()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return s; 
} 

回答

0

您将需要创建一个XMLParser.java文件,使您能够解析XML。然后使用相应的方法来解析你的响应XML输出,并将它们显示为ListView,GridView,CardView等。请参考下面的代码,在解析XML时总是适用于我。

//-------------------------------------------------------------- 
//** XML Output 
//-------------------------------------------------------------- 

<?xml version="1.0" encoding="UTF-8"?> 
<menu> 
    <item> 
     <id>1</id> 
     <name>Manchester United</name> 
    </item> 
    <item> 
     <id>2</id> 
     <name>Barcelona</name> 
    </item> 
    <item> 
     <id>3</id> 
     <name>Real Madrid</name> 
    </item> 
    <item> 
     <id>4</id> 
     <name>Arsenal</name> 
    </item> 
</menu> 

//-------------------------------------------------------------- 
//** list_item.xml 
//-------------------------------------------------------------- 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 

    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

    <TextView 
     android:id="@+id/name" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textColor="#dc6800" 
     android:textSize="16sp" 
     android:textStyle="bold" 
     android:paddingTop="6dip" 
     android:paddingBottom="2dip" /> 

    </LinearLayout> 

</LinearLayout> 

//-------------------------------------------------------------- 
//** main.xml 
//-------------------------------------------------------------- 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical"> 

    <ListView android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"/> 

</LinearLayout> 


//-------------------------------------------------------------- 
//** XMLParser.java 
//-------------------------------------------------------------- 

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

//-------------------------------------------------------------- 
//** MainActivity.java 
//-------------------------------------------------------------- 

public class MainActivity extends ListActivity { 

    // All static variables 
    static final String URL = "http://api.foo.foo/foo/?format=xml"; // Your XML output 
    // XML node keys 
    static final String KEY_ITEM = "item"; // parent node 
    static final String KEY_ID = "id"; 
    static final String KEY_NAME = "name"; 

    @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_ITEM); 
     // 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_ID, parser.getValue(e, KEY_ID)); 
      map.put(KEY_NAME, parser.getValue(e, KEY_NAME)); 

      // adding HashList to ArrayList 
      menuItems.add(map); 
     } 

     // Adding menuItems to ListView 
     ListAdapter adapter = new SimpleAdapter(this, menuItems, 
       R.layout.list_item, 
       new String[] { KEY_NAME }, new int[] { 
       R.id.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 name = ((TextView) view.findViewById(R.id.name)).getText().toString(); 
      } 
     }); 
    } 
} 
+0

这是行不通的,首先defaulthttpclient的不解决,但是当我解决它存在于类三振出局,然后在网络部分应asyntask完成的应用程序崩溃和logcat中说的机器人。 os.NetworkOnMainThreadException。你可以建议其他的东西 – Avinash

+0

它对我有用......只要确保你的XML回来了就像一个URL并且解析它就像我上面的例子。 – nocholla

+0

我的sdk版本是更新的one..so其不工作.. async任务将做它..虐待检查它然后 – Avinash