HashMap的android系统中的XML解析 [英] hashmap in android xml parsing

查看:391
本文介绍了HashMap的android系统中的XML解析的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要取的Andr​​oid应用程序从XML源和显示数据。

我的XML饲料看起来像:

 <根和GT;
 <类别>
  <类别名称=书籍>
   <文章和GT;
  <物品条款ArticleID =4537标题=机器人/>
  <物品条款ArticleID =4560的称号=的Java/>
   <物品条款ArticleID =4585标题=PHP/>
   <物品条款ArticleID =4731标题=MySQL的/>
  < /文章与GT;
 < /分类>
  <类别名称=名称>
   <文章和GT;
      <物品条款ArticleID =266标题=涤塔夫/>
       <物品条款ArticleID =268标题=弗里达/>
        <物品条款ArticleID =269标题=黛咪/>
        <物品条款ArticleID =271标题=沙马兰/>
          <物品条款ArticleID =269标题=Krish/>< /文章与GT;
         < /分类>
          < /类别和GT;< /根>

在这里,我要显示的类别name.also必须显示文章标题属于category.i要显示的输出是:

 书籍      Android的Java的PHP的MySQL     名称     迪塔弗里达黛咪沙马兰Krish

我已经用下面code:

 静态最后弦乐KEY_TITLE =类别;
   静态最后弦乐KEY_ARTICLE =文章;
      @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);        最终的ArrayList<&HashMap的LT;字符串,字符串>> songsList =新的ArrayList<&HashMap的LT;字符串,字符串>>();
        XMLParser的解析器=新XMLParser的();
        字符串XML = parser.getXmlFromUrl(URL); // URL从XML获得
        文档的文档= parser.getDomElement(XML); //获得DOM元素        节点列表NL = doc.getElementsByTagName(KEY_TITLE);
        节点列表NL1 = doc.getElementsByTagName(KEY_ARTICLE);
                的System.out.println(nl.getLength());
        LT;歌曲和放大器; //遍历所有歌曲节点&放循环GT;
        的for(int i = 0; I< nl.getLength();我++){
            //创建新的HashMap
            的System.out.println(nl.getLength());
            HashMap的<字符串,字符串>地图=新的HashMap<字符串,字符串> ();
            map.put(KEY_TITLE,((元)nl.item(I))的getAttribute(名称));
           对于(INT J = 0; J< nl1.getLength(); J ++){
              map.put(KEY_ARTICLE,((元)nl1.item(J))的getAttribute(称号)。);
                }
           songsList.add(地图);
          }

在这里,我需要运行的应用程序是指文章标题displayed.but文章标题没有显示correctly.my当前O / P是寻找象下面这样:

 书籍      Krish Krish     名称     Krish Krish

上一篇文章标题dispalyed所有categories.Why这些错误发生?请帮我...我怎样才能解决这些错误?请提供我一些想法?

编辑:

我已经改变了我的code象下面这样:

 公共类MainActivity延伸活动{
      静态最终字符串URL =XXX; 静态最后弦乐KEY_TITLE =类别;
 静态最后弦乐KEY_ARTICLE =文章;
 静态最后弦乐KEY_IMAGE =形象;
 LazyAdapter适配器; @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);     最终的ArrayList<&HashMap的LT;字符串列表<串GT;>> songsList =新的ArrayList<&HashMap的LT;字符串列表<串GT;>>();
        XMLParser的解析器=新XMLParser的();
        字符串XML = parser.getXmlFromUrl(URL); // URL从XML获得
        文档的文档= parser.getDomElement(XML); //获得DOM元素        节点列表NL = doc.getElementsByTagName(KEY_TITLE);
        节点列表NL1 = doc.getElementsByTagName(KEY_ARTICLE);
        节点列表NL2 = doc.getElementsByTagName(KEY_IMAGE);
        的System.out.println(nl.getLength());
        HashMap的<字符串列表<串GT;>地图=新的HashMap<字符串列表<串GT;>();
        的for(int i = 0; I< nl.getLength();我++){
            字符串名称=((元)nl.item(I))的getAttribute(名称)。
             populateMap(地图,名称,KEY_TITLE);           对于(INT J = 0; J< nl1.getLength(); J ++){
                字符串title =((元)nl1.item(J))的getAttribute(题)。
                populateMap(地图,标题,KEY_ARTICLE);
                字符串URL =((元)nl2.item(J))的getAttribute(URL)。
                populateMap(地图,网址,KEY_IMAGE);
                }
           songsList.add(地图);
       }
    GridView控件列表=(GridView控件)findViewById(R.id.listView1);
         适配器=新LazyAdapter(这一点,songsList);
         list.setAdapter(适配器);
   私人无效populateMap(HashMap的<字符串列表<串GT;>地图,字符串值,
        字符串键){
    // TODO自动生成方法存根
     清单<串GT; myList中;
     如果(!map.containsKey(键)){
         myList中=新的ArrayList<串GT;();
         myList.add(值);
         map.put(键,myList中);
     }其他{
         myList中= map.get(键);
         myList.add(值);
     }

现在我需要运行的应用程序的手段我得到的O / P象下面这样:

  [书籍,名字]
[Android及Java,PHP,MySQL和迪塔,弗里达,黛米,沙马兰,Krish] [Android及Java,PHP,MySQL和迪塔,弗里达,黛米,沙马兰,Krish][书籍,名字]
[Android及Java,PHP,MySQL和迪塔,弗里达,黛米,沙马兰,Krish] [Android及Java,PHP,MySQL和迪塔,弗里达,黛米,沙马兰,Krish]

请提供给我一些想法得到正确的O / P(我需要设计)。

这是我的LazyAdpter文件:

 公共类LazyAdapter延伸BaseAdapter {
            私人活动活动;
            私人的ArrayList<&HashMap的LT;字符串列表<串GT;>>数据;
            私有静态LayoutInflater吹气= NULL;
           公共ImageLoader的ImageLoader的;
          ListAdapter listViewAdapter;
            公共LazyAdapter(活动一,ArrayList的<&HashMap的LT;字符串列表<串GT;>> songsList){
                   活性=一个;
                  数据= songsList;
                  吹气=(LayoutInflater)活动
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                            ImageLoader的=新ImageLoader的(activity.getApplicationContext());
                }        公众诠释的getCount(){
                    返回data.size();
                   }             公共对象的getItem(INT位置){
              返回的位置;
            }         众长getItemId(INT位置){
            返回的位置;
            }            公共查看getView(INT位置,查看convertView,父母的ViewGroup){
            查看VI = convertView;
                VI = inflater.inflate(R.layout.list_row,父母,假);
                TextView的标题=(TextView中)vi.findViewById(R.id.title);
                图库列表视图=(图库论坛)六.findViewById(R.id.model);            HashMap的<字符串列表<串GT;>项目=新的HashMap<字符串列表<串GT;>();
             项目= data.get(位置);
             title.setText(item.get(MainActivity.KEY_TITLE)的ToString());
                  listViewAdapter =新ListAdapter(活动数据);
                 listview.setAdapter(listViewAdapter);
                     返回VI;
            }

这是ListAdapter类:

 公共查看getView(INT位置,查看convertView,父母的ViewGroup){
           查看VI = convertView;
            VI = inflater.inflate(R.layout.listrow,父母,假);
            TextView的标题=(TextView中)vi.findViewById(R.id.textView1);
            HashMap的<字符串列表<串GT;>项目=新的HashMap<字符串列表<串GT;>();
            项目= data.get(位置);
        title.setText(item.get(MainActivity.KEY_ARTICLE)的ToString());
         返回VI;
            }


解决方案

 地图<字符串列表<串GT;> categoryToArticlesMap =新的HashMap<字符串列表<串GT;>();
节点列表categoryNd = doc.getElementsByTagName(类别);
的for(int i = 0; I< categoryNd.getLength();我++)
{
    元素e =(元)categoryNd.item(I)
    字符串categoryName = e.getAttribute(名称);
    节点列表articlesNd = e.getElementsByTagName(公司章程);
    元件E1 =(元件)articlesNd.item(0);
    节点列表articleNd = e1.getElementsByTagName(文章);
    清单<串GT;文章=新的ArrayList<串GT;();
    对于(INT J = 0; J< articleNd.getLength(); J ++){
        元素articleNode =(元)articleNd.item(J);
        字符串articleName = articleNode.getAttribute(标题);
        articles.add(articleName);
    }
    categoryToArticlesMap.put(类别名称,文章);
}

这会给你所需的输出。

I have to fetch the data from xml feed and display on android application.

my xml feed is looking like:

<root>
 <Categories>
  <Category name="Books">
   <Articles>
  <article articleid="4537" title="Android" />
  <article articleid="4560" title="Java" />
   <article articleid="4585" title="PHP" />
   <article articleid="4731" title="MySql" />
  </Articles>
 </Category>
  <Category name="Names">
   <Articles> 
      <article articleid="266" title="Dita" />
       <article articleid="268" title="Frieda" />
        <article articleid="269" title="Demi" />
        <article articleid="271" title="Shyamalan" />
          <article articleid="269" title="Krish" /></Articles>
         </Category>
          </Categories></root>

Here i have to display category name.also have to display the article title for belonging category.i wish to display the output is:

      Books

      Android  Java  PHP  MySql

     Names

     Dita  Frieda  Demi  Shyamalan Krish

I have using below code:

static final String KEY_TITLE = "Category";
   static final String KEY_ARTICLE = "article";
      @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
        XMLParser parser = new XMLParser();
        String xml = parser.getXmlFromUrl(URL); // getting XML from URL
        Document doc = parser.getDomElement(xml); // getting DOM element

        NodeList nl = doc.getElementsByTagName(KEY_TITLE);
        NodeList nl1 = doc.getElementsByTagName(KEY_ARTICLE);
                System.out.println(nl.getLength());
        // looping through all song nodes &lt;song&gt;
        for (int i = 0; i < nl.getLength(); i++) {
            // creating new HashMap
            System.out.println(nl.getLength());
            HashMap<String, String> map = new HashMap<String, String>   ();
            map.put( KEY_TITLE,((Element)nl.item(i)).getAttribute("name"));
           for (int j = 0; j < nl1.getLength(); j++) {
              map.put( KEY_ARTICLE,((Element)nl1.item(j)).getAttribute("title"));
                }
           songsList.add(map);
          }

Here i have to run the app means the article title is displayed.but the article title is didn't display correctly.my current o/p is looking like below:

     Books

      Krish  Krish  

     Names

     Krish  Krish 

The last article title is dispalyed on all categories.Why these error is occurring ??? please help me...how can i resolve these error ??? please provide me some ideas ???

EDIT:

I have changed my code like below:

     public class MainActivity extends Activity {
      static final String URL = "xxx";

 static final String KEY_TITLE = "Category";
 static final String KEY_ARTICLE = "article";
 static final String KEY_IMAGE = "image";
 LazyAdapter adapter;

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

     final ArrayList<HashMap<String, List<String>>> songsList = new ArrayList<HashMap<String, List<String>>>();
        XMLParser parser = new XMLParser();
        String xml = parser.getXmlFromUrl(URL); // getting XML from URL
        Document doc = parser.getDomElement(xml); // getting DOM element

        NodeList nl = doc.getElementsByTagName(KEY_TITLE);
        NodeList nl1 = doc.getElementsByTagName(KEY_ARTICLE);
        NodeList nl2 = doc.getElementsByTagName(KEY_IMAGE);
        System.out.println(nl.getLength());
        HashMap<String, List<String>> map = new HashMap<String, List<String>>();
        for(int i = 0; i < nl.getLength(); i++) {
            String name = ((Element) nl.item(i)).getAttribute("name");
             populateMap(map, name, KEY_TITLE);

           for(int j = 0; j < nl1.getLength(); j++) {
                String title=((Element) nl1.item(j)).getAttribute("title");
                populateMap(map, title, KEY_ARTICLE);
                String url=((Element) nl2.item(j)).getAttribute("url");
                populateMap(map, url, KEY_IMAGE);
                } 
           songsList.add(map); 
       } 
    GridView list = (GridView) findViewById(R.id.listView1);
         adapter = new LazyAdapter(this, songsList);
         list.setAdapter(adapter);
   private void populateMap(HashMap<String, List<String>> map, String value,
        String key) {
    // TODO Auto-generated method stub
     List<String> myList;
     if(!map.containsKey(key)) {
         myList = new ArrayList<String>();
         myList.add(value);
         map.put(key, myList);
     } else {
         myList = map.get(key);
         myList.add(value);
     }

Now i have to run the app means am getting the o/p like below:

[Books,Names]
[Android,Java,PHP,Mysql,Dita,Frieda,Demi,Shyamalan,Krish]  [Android,Java,PHP,Mysql,Dita,Frieda,Demi,Shyamalan,Krish]

[Books,Names]
[Android,Java,PHP,Mysql,Dita,Frieda,Demi,Shyamalan,Krish]  [Android,Java,PHP,Mysql,Dita,Frieda,Demi,Shyamalan,Krish]

pls provide me some idea to get the correct o/p(my needed design).

This is my LazyAdpter file :

         public class LazyAdapter extends BaseAdapter {
            private Activity activity;
            private ArrayList<HashMap<String, List<String>>> data;
            private static LayoutInflater inflater = null;
           public ImageLoader imageLoader;
          ListAdapter listViewAdapter;
            public LazyAdapter(Activity a, ArrayList<HashMap<String, List<String>>> songsList) {
                   activity = a;
                  data = songsList;
                  inflater = (LayoutInflater) activity
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                            imageLoader = new ImageLoader(activity.getApplicationContext());
                }

        public int getCount() {
                    return data.size();
                   }

             public Object getItem(int position) {
              return position;
            }

         public long getItemId(int position) {
            return position;
            }

            public View getView(int position, View convertView, ViewGroup parent) {
            View vi = convertView;
                vi = inflater.inflate(R.layout.list_row,parent, false);


                TextView title = (TextView) vi.findViewById(R.id.title); 
                Gallery listview = (Gallery) vi .findViewById(R.id.model);

            HashMap<String, List<String>> item = new HashMap<String, List<String>>();
             item = data.get(position);
             title.setText(item.get(MainActivity.KEY_TITLE).toString());
                  listViewAdapter = new ListAdapter(activity, data);
                 listview.setAdapter(listViewAdapter);
                     return vi;
            }

This is ListAdapter class:

      public View getView(int position, View convertView, ViewGroup parent) {
           View vi = convertView;
            vi = inflater.inflate(R.layout.listrow,parent, false);
            TextView title = (TextView) vi.findViewById(R.id.textView1); 
            HashMap<String, List<String>> item = new HashMap<String, List<String>>();
            item = data.get(position);
        title.setText(item.get(MainActivity.KEY_ARTICLE).toString());
         return vi;
            }

解决方案

Map<String,List<String>> categoryToArticlesMap = new HashMap<String,List<String>>();
NodeList categoryNd = doc.getElementsByTagName("Category");
for (int i = 0; i < categoryNd.getLength(); i++) 
{
    Element e = (Element) categoryNd.item(i);
    String categoryName = e.getAttribute("name"); 
    NodeList articlesNd = e.getElementsByTagName("Articles");
    Element e1 = (Element) articlesNd.item(0);
    NodeList articleNd = e1.getElementsByTagName("article");
    List<String> articles = new ArrayList<String>();
    for (int j = 0; j < articleNd.getLength(); j++) {
        Element articleNode = (Element) articleNd.item(j);
        String articleName = articleNode.getAttribute("title");
        articles.add(articleName);
    }
    categoryToArticlesMap.put(categoryName, articles);
}

This will give you the required output.

这篇关于HashMap的android系统中的XML解析的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆