HashMap的android系统中的XML解析 [英] hashmap in android xml parsing
问题描述
我要取的Android应用程序从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 <song>
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屋!