How to parse XML (especific structure) in Android? - android

I need to parse a specific part of an XML obtained from a http request but I do not know how to do it!
I have the following XML structure being returned:
<categorias type="array">
<categoria>
<nome>
Alimentação
</nome>
<idcategoria>
5
</idcategoria>
<subcategorias>
<subcategoria>
<nome>
Todos
</nome>
<id>
5
</id>
</subcategoria>
</subcategorias>
</categoria>
</categorias>
I need to parse the data inside the subcategorias
tag because with the code I have now, I get only the upper tags, like
nome and idcategoria from the root tag categoria.
I've created a NodeList inside the for loop but it return all the subcategoria tags in the Document. And I need to get only the ones inside a unique categoria tag.
Here's the code I have now:
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);
}
Can someone help me on this!?
Thanks in advance!

Have a look at this official document of Android which describe XMLPullParser.
You have to implement your logic according to your XML structure.

Aside from XMLPullParser, another option for parsing XML is to use the Simple XML library. It will allow you to easily deserialize that XML into an object which you can manipulate however you wish. It would be possible for you to ignore all other child elements in categoria and just capture subcategorias by using loose object mapping. Check the Simple Framework documentation for more information.

#Android Coader is right, "You have to implement your logic according to your XML structure"
Why do you have a KEY_ITEM, when there are no "item" tags in your XML? You need to specify in the code which tags you want to retrieve. For example, if you define a KEY_SUBCATEGORIA = "subcategoria", then to get all subcategory nodes you can do
NodeList nl = doc.getElementsByTagName(KEY_SUBCATEGORIA);
Then you should navigate through each node, pulling out the name and id's as you are doing now.

I got it!
I used only the same kind of structure I had before!
I added this code inside the for loop I had:
NodeList nlSubcategorias = e.getElementsByTagName("subcategoria");
ArrayList<HashMap<String, String>> subcategorias = new ArrayList<HashMap<String, String>>();
for (int j = 0; j < nlSubcategorias.getLength(); j++) {
HashMap<String, String> mapSub = new HashMap<String, String>();
Element eSub = (Element)nlSubcategorias.item(j);
mapSub.put(KEY_ID_SUB, parser.getValue(eSub, KEY_ID_SUB));
mapSub.put(KEY_NAME_SUB, parser.getValue(eSub, KEY_NAME_SUB));
subcategorias.add(mapSub);
System.out.println("subcategorias: " + subcategorias.get(j).get(KEY_NAME_SUB));
}
subcategoriasItems.add(subcategorias);

Related

Get values from a XML contained in a String

I have a String variable containing an XML:
String xml = "<?xml version="1.0" encoding="utf-8" standalone="yes"?><CourtactSioux><ListeContact><IdContactClient>212</IdContactClient><DateContact>25/06/2012 08:09</DateContact><TypeForm>STANDARD</TypeForm><Foyer>2</Foyer><Civilite>M</Civilite><Nom>TEST</Nom><Prenom>JULIEN</Prenom><NomJeuneFille></NomJeuneFille></ListeContact></CourtactSioux>"
And I want to take values from this XML, how to do ?
For exemple: get "Civilite" value.
I tried this:
String xml = cn.getXml();
Integer demandeId = cn.getID();
XMLParser parser = new XMLParser();
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++) {
Element e = (Element) nl.item(i);
idApplication = parser.getValue(e, IdApplication);
idContactClient = parser.getValue(e, IdContactClient);
logement = parser.getValue(e, Logement);
typeForm = parser.getValue(e, TypeForm);
}
id = idApplication + idContactClient;
Product product = new Product()
.setId(id)
.setName(logement)
.setCategory(typeForm)
.setPrice(1)
.setQuantity(1);
ProductAction productAction = new ProductAction(ProductAction.ACTION_PURCHASE)
.setTransactionId(id)
.setTransactionAffiliation("Solutis")
.setTransactionRevenue(1);
HitBuilders.ScreenViewBuilder builder = new HitBuilders.ScreenViewBuilder()
.addProduct(product)
.setProductAction(productAction);
Tracker t = ((App) getApplication()).getTracker();
t.setScreenName("transaction");
t.send(builder.build());
}
It's work, get attention on the aprent node of your xml
There are several ways of parsing XML in android. You could use XMLReader.parse(InputSource) by wrapping the string in a reader, as shown here
Check the Parsing XML Data part of Android Developers site for more information.

multiple item xml parsin in android

My XML is like this:
<?xml version="1.0" encoding="UTF-8"?>
<menu>
<item>
<id>1</id>
<name>Margherita</name>
<cost>
<p>155</p>
<p>255</p>
<p>355</p>
<p>455</p>
</cost>
<description>Single cheese topping</description>
</item>
<item>
<id>2</id>
<name>Double Cheese Margherita</name>
<cost>
<p>900</p>
<p>155</p>
</cost>
<description>Loaded with Extra Cheese</description>
</item>
<item>
<id>3</id>
<name>Fresh Veggie</name>
<cost>
<p>335</p>
</cost>
<description>Oninon and Crisp capsicum</description>
</item>
in cost tag I have other tags
I'm trying to parsing the xml with this:
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));
map.put(KEY_DESC, parser.getValue(e, KEY_DESC));
// adding HashList to ArrayList
menuItems.add(map);
}
I want to access to the child nodes, which here is and add another loop to access to all values
How to get access to childern nodes ?!
Your items are already stored in that list, you can get an element like this:
HashMap item = menuItems.get(0); // get the first item
Or you can loop through all elements in your list:
for (HashMap item: menuItems) {
// do something
}
Now you might wonder how you would access it's properties, you can use a HashMap like this:
String name = item.get(KEY_NAME);

Android parse a very simple XML Array

This might sound dumb, but I just need the help with the logic,
I have this very simple XML array:
<plist version="1.0">
<array>
<string>Lisa Jackson</string>
<string>Elisabeth Hartmann</string>
<string>C. J. Sansom</string>
<string>Irmengard Gabler</string>
<string>Oliver Pötzsch</string>
<string>Ulla Illerhaus</string>
<string>Christopher J. Sansom</string>
<string>Nina Blazon</string>
<string>Nicholas Lessing</string>
<string>Johannes Steck</string>
<string>Peter Kaempfe</string>
<string>Dimeter Inkiow</string>
<string>Barbara Sher</string>
<string>Ulrike Hübschmann</string>
<string>Otfried Preußler</string>
<string>Ulla Illerhaus</string>
<string>Annette Kurth</string>
</array>
</plist>
but when I try to parse it this way:
static final String KEY_ITEM = "string";
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);
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));
menuItems.add(map);
}
It displays the list based on the number of the given (17 list items) on the XML file, but it doesn't display any of the content, like 'Lisa Jackson', 'Elisabeth Hartmann', etc.
How can I resolve this?
element.getTextContent();
This will get the text value needed.
OR
for (int in = 0; in < numberOfChildren; in++) {
Node node = nl.item(in);
Log.d("skt",node.getNodeName() + " = " + node.getTextContent());
//node.getTextContent() has the text. Add it to map
}

How to get all the values from the child nodes in android 4.0?

I would like to list all the values of the tag inside in android 4.0 as of now I am able to get only one value I have added the snippet which I am using right now & also the xml below.Please help with the this with snippet or example.Thanks a lot.
NodeList nodes = doc.getElementsByTagName("month");
for (int i = 0; i < nodes.getLength(); i++)
{
Element e = (Element) nodes.item(i);
stock_list.add(getValue(e, "month"));
}
Here is my xml
The nodeValue of an XML Element is null by definition. Thus, you can either
query the element's children for the Text node containing the actual contents, or
simply use e.getTextContent() to retrieve the text content of the XML element.
Try this code i was having the same problem and solved it this way..
ArrayList<HashMap<String, String>> stock_list = new ArrayList<HashMap<String, String>>();
NodeList nodes = doc.getElementsByTagName("month");
for (int i = 0; i < nodes.getLength(); i++) {
HashMap<String, String> map = new HashMap<String, String>();
Node name = nodes.item(i);
NodeList month = name.getChildNodes();
map.put("months", ((Node) month.item(0)).getNodeValue());
stock_list.add(map);
}

How to get attibute and values in xml parsing in android?

I have a xml file having a format of
<question_choices>
<question id="499">What do you call a chicken with bad sunburn</question>
<choices1 id="2231">Burned Chicken</choices1>
<choices2 id="2230">Fried Chicken</choices2>
<choices3 id="2232">Dead Chicken</choices3>
<choices_answer>Fried Chicken</choices_answer>
</question_choices>
I have to get both the id and the value during parsing.Also I have set these options in 3 different buttons.So when I click these choice I have to get the value and corresponding id also have to be saved.I tried to use getAttributes() but I dont know where and how to use.So it was not successful.
final XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL); // getting XML
Document doc = parser.getDomElement(xml); // getting DOM element
final NodeList nl = doc.getElementsByTagName(KEY_QUESTION);
// looping through all item nodes <item>
for(int j=0;j<nl.getLength();j++)
{
Element e = (Element) nl.item(j);
listnew[j]=parser.getValue(e,KEY_QUEST);
options1[j]= parser.getValue(e, KEY_CHOICE1);
options2[j]= parser.getValue(e, KEY_CHOICE2);
options3[j]= parser.getValue(e, KEY_CHOICE3);
}
TextView question = (TextView)findViewById(R.id.question);
question.setText(listnew[x]);
opt1 = (Button)findViewById(R.id.opt1);
opt1.setText(options1[x]);
opt1.setOnClickListener(myOptionOnClickListener);
opt2 = (Button)findViewById(R.id.opt2);
opt2.setText(options2[x]);
opt2.setOnClickListener(myOptionOnClickListener);
opt3 = (Button)findViewById(R.id.opt3);
opt3.setText(options3[x]);
opt3.setOnClickListener(myOptionOnClickListener);
x++;
}
I'm using a DOM parser for parsing.The option what is clicked have to be saved.How should I do this?
Try this:
Document doc = parser.getDomElement(xml);
String idQuestion = doc.getElementsByTagName("question").item(0)
.getAttributes().getNamedItem("id").getNodeValue();
String idChoise1 = doc.getElementsByTagName("choices1 ").item(0)
.getAttributes().getNamedItem("id").getNodeValue();
...

Categories

Resources