【问题标题】:How to parse same name tag in Android XML DOM Parsing?如何在 Android XML DOM Parsing 中解析同名标签?
【发布时间】:2013-06-29 13:54:48
【问题描述】:

我无法在这里解析我的 XML。它仅返回“项目”。
我的AndroidActivity 很大,无法显示。所以我只展示了负责解析的部分。

我的 XML 看起来像这样:

<MyResource>
<Item>First</Item>
<Item>Second</Item>
</MyResource>

我的ActivityClass方法:

public class ShowItems extends Activity{
    ListView lv;
    ListAdapter adapter;
    static final String KEY_RESOURCE = "MyResource"; // parent node 
    static final String KEY_ITEM = "Item";
    ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
    String[] from={KEY_ITEM };
    int[] to={R.id.mylist_item};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.showitems);
        
        lv=(ListView) findViewById(R.id.lv_items);
        parseXML();
        adapter = new SimpleAdapter(this, mylist,R.layout.list_item,from , to); 
        lv.setAdapter(adapter);
    }

private void parseXML() {
    // TODO Auto-generated method stub
    XMLParser parser = new XMLParser();
    
    final String URL="http://10.0.2.2:8080/MySite/xml";
    String xml = parser.getXmlFromUrl(URL); 
    Document doc = parser.getDomElement(xml); 
    NodeList nl = doc.getElementsByTagName(KEY_RESOURCE); 
    for (int i = 0; i < nl.getLength(); i++) {

        HashMap<String, String> map = new HashMap<String, String>();
        Element e = (Element) nl.item(i); 
        map.put(KEY_ITEM, parser.getValue(e, KEY_ITEM)); 
        mylist.add(map); }
}

我的 XML 解析器类:

import java.io.IOException;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import android.util.Log;
public class XMLParser {
    public String getXmlFromUrl(String url) { 
        String xml = null; 
        try { 
            HttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);
            HttpResponse httpResponse = httpClient.execute(httpGet);
            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; 
    }
    
    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 DOM 
            return doc; 
    }
    
    public String getValue(Element item, String str) {       
        NodeList n = item.getElementsByTagName(str);         
        return this.getElementValue(n.item(0)); 
    } 
    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 ""; 
      } 
}

我无法在这里解析我的 XML。这里有什么问题?
它仅返回“项目”。
我需要在我的ActivityClass 中做什么,尤其是在这部分代码中?

String xml = parser.getXmlFromUrl(URL); 
    Document doc = parser.getDomElement(xml); 
    NodeList nl = doc.getElementsByTagName(KEY_RESOURCE); 
    for (int i = 0; i < nl.getLength(); i++) {
        
        
        HashMap<String, String> map = new HashMap<String, String>();
        Element e = (Element) nl.item(i); 
        map.put(KEY_ITEM, parser.getValue(e, KEY_ITEM)); 
        mylist.add(map); }

【问题讨论】:

  • 我不知道你想要什么,你能说清楚点吗?
  • 您会看到他的 XML。他有两个&lt;Item&gt; 标签需要通过DOM 进行解析。而当他通过上述方法解析它时,只解析第一个&lt;Item&gt;标签,其他(或其余的)被忽略。
  • @AltairRules: 1) 您是否将“第一”(或)“第二”作为输入? 2) 你能打印并查看 NodeList nl = doc.getElementsByTagName(KEY_RESOURCE); 的大小吗?
  • 我的意思是“第二”作为输出,而不是输入
  • 当我这样做时,我将输出为“项目”:System.out.println(mylist);

标签: android dom xml-parsing android-xml


【解决方案1】:

您的getValue() 方法获取MyResource 元素,从那里,您需要获取MyResource 下的所有项目并执行getElementValue()。示例代码为:

   public Map getValue(Element item, String str) {
        NodeList n = item.getElementsByTagName(str);
        for (int i = 0; i < n.getLength(); i++) {
            System.out.println(getElementValue(n.item(i)));
        }
        //Here store it in list/map and return list/map instead of String
        return list/MapHere;
    }

【讨论】:

  • 我应该把这段代码放在哪里。看到我的 for 循环正在运行。我应该如何调用这个方法?
  • @Altair:你在 XMLParser 类中有这个方法。
  • System.out.println(getElementValue(n.item(i))); 正在显示我的 Logcat 输出中的所有项目...但仅检索到 First
  • @Altair:我的代码是打印到控制台的示例,如果您希望它返回,您需要将这些值存储在某个地方,对吗?把它们放在地图(或)列表或某个地方。
  • okay.well 我将它存储在地图中 na ?? map.put(KEY_ITEM, parser.getValue(e, KEY_ITEM));
猜你喜欢
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 2011-01-30
  • 1970-01-01
相关资源
最近更新 更多