Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java androidxml解析中的hashmap_Java_Android_Xml Parsing_Iterator_Hashmap - Fatal编程技术网

Java androidxml解析中的hashmap

Java androidxml解析中的hashmap,java,android,xml-parsing,iterator,hashmap,Java,Android,Xml Parsing,Iterator,Hashmap,我必须从xml提要获取数据并在android应用程序上显示 我的xml提要如下所示: <root> <Categories> <Category name="Books"> <Articles> <article articleid="4537" title="Android" /> <article articleid="4560" title="Java" /> <article arti

我必须从xml提要获取数据并在android应用程序上显示

我的xml提要如下所示:

<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>
我使用了以下代码:

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);
          }
最后一篇文章的标题显示在所有类别上。为什么会发生这些错误???请帮助我…我如何解决这些错误???请给我一些想法

编辑:

我已更改代码,如下所示:

     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);
     }
请给我一些想法,以获得正确的o/p(我需要的设计)

这是我的Lazyadter文件:

         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;
            }
公共类LazyAdapter扩展了BaseAdapter{
私人活动;
私有数组列表数据;
专用静态充气机=空;
公共图像加载器;
ListAdapter listViewAdapter;
公共LazyAdapter(活动a,ArrayList歌曲列表){
活动=a;
数据=歌曲列表;
充气器=(充气器)活动
.getSystemService(上下文布局\充气机\服务);
imageLoader=新的imageLoader(activity.getApplicationContext());
}
public int getCount(){
返回data.size();
}
公共对象getItem(int位置){
返回位置;
}
公共长getItemId(int位置){
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视图vi=转换视图;
vi=充气机。充气(右布局。列表行,父,假);
TextView title=(TextView)vi.findViewById(R.id.title);
Gallery listview=(Gallery)vi.findViewById(R.id.model);
HashMap项=新建HashMap();
item=data.get(位置);
title.setText(item.get(MainActivity.KEY_title.toString());
listViewAdapter=新的ListAdapter(活动、数据);
setAdapter(listViewAdapter);
返回vi;
}
这是ListAdapter类:

      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;
            }
public View getView(int位置、视图转换视图、视图组父视图){
视图vi=转换视图;
vi=充气机充气(R.layout.listrow,父项,false);
TextView title=(TextView)vi.findViewById(R.id.textView1);
HashMap项=新建HashMap();
item=data.get(位置);
title.setText(item.get(MainActivity.KEY_ARTICLE.toString());
返回vi;
}

在这一行
map.put(KEY_ARTICLE,((Element)nl1.item(j)).getAttribute(“title”);
您过度写入了地图中以前的值。将
ArrayList songsList
更改为
ArrayList songsList
,并将每个值添加到列表中并将其放入地图。
即使这样做,也会得到如下输出:

Books    
Android Java PHP MySQL Dita Frieda Demi Shyamalan Krish     
Names     
Android Java PHP MySQL Dita Frieda Demi Shyamalan Krish 

为了获得所需的输出,在每个代码< >类别>代码下,应考虑<代码> >文章>代码>的NODLIST,而不是在文档中获得所有的<>代码>文章< /代码>标签。

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);
}
nodelistcategorynd=doc.getElementsByTagName(“类别”); 对于(int i=0;i
这将为您提供所需的输出。

我的回答有助于您解决此问题吗?您是从我发布的代码中获得此输出的吗?@Festus Tamakloe是的,我是从您的回答中获得这些o/p您的项目是开源的吗?您为什么需要
ArrayList Android Java PHP MySQL和名称-->Dita Frieda Demi Shymalan Krish,对吗?是的希望o/p看起来像书-->Android Java PHP MySQL和名称-->Dita Frieda Demi Shyamalan Krish ly…你可能会说像将ArrayList歌曲列表更改为ArrayList歌曲列表..这就是我编写的上述代码
      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;
            }
Books    
Android Java PHP MySQL Dita Frieda Demi Shyamalan Krish     
Names     
Android Java PHP MySQL Dita Frieda Demi Shyamalan Krish 
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);
}