Parse two elements with same name android - android

I'm a bit new to XML and Android development... I've encountered this issue where I need to parse an XML where the elements are the same and include that with the overall element. It's a bit hard to explain, see code below:
<tns:camera>
<tns:congestionLocations>
<tns:congestion>Free Flow</tns:congestion>
<tns:direction>Eastbound</tns:direction>
</tns:congestionLocations>
<tns:congestionLocations>
<tns:congestion>Free Flow</tns:congestion>
<tns:direction>Westbound</tns:direction>
</tns:congestionLocations>
<tns:description>Bond St looking east</tns:description>
<tns:direction>Eastbound</tns:direction>
<tns:group>SH16-North-Western</tns:group>
<tns:lat>-36.869</tns:lat>
<tns:lon>174.746</tns:lon>
<tns:name>SH16 1 Bond St</tns:name>
<tns:viewUrl>http://www.trafficnz.info/camera/view/130</tns:viewUrl>
</tns:camera>
Basically, I need to parse the overall element (tns:camera) and include the congestion locations (seperated from each other obviously), but within the same class as i will be using all of them in a listview...
How would I achieve this?
At present, I am using the Pull Parser, and parsing it into a class object
PullParser code:
case XmlPullParser.END_TAG:
if (tagname.equalsIgnoreCase(KEY_SITE)) {current Site
CameraSites.add(curCameraClass);
} else if (tagname.equalsIgnoreCase(KEY_DESCRIPTION)) {
curCameraClass.setDescription(curText);
}else if (tagname.equalsIgnoreCase(KEY_NAME)) {
curCameraClass.setName(curText);
}
break;
Kind Regards!

Try this..
NodeList nodeList = doc.getElementsByTagName("tns:camera");
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
Element fstElmnt = (Element) node;
NodeList nameList = fstElmnt.getElementsByTagName("tns:group");
Element nameElement = (Element) nameList.item(0);
nameList = nameElement.getChildNodes();
System.out.println("tns:group : "+((Node) nameList.item(0)).getNodeValue());
Element fstElmnt1 = (Element) node;
NodeList nameList1 = fstElmnt1.getElementsByTagName("tns:viewUrl");
Element nameElement1 = (Element) nameList1.item(0);
nameList1 = nameElement1.getChildNodes();
System.out.println("tns:viewUrl : "+ ((Node) nameList1.item(0)).getNodeValue());
//same as use to all tns:description,tns:direction and tns:lat etc.,
if(node.getNodeType() == Node.ELEMENT_NODE)
{
Element e = (Element) node;
NodeList resultNodeList = e.getElementsByTagName("tns:congestionLocations");
int resultNodeListSize = resultNodeList.getLength();
for(int j = 0 ; j < resultNodeListSize ; j++ )
{
Node resultNode = resultNodeList.item(j);
if(resultNode.getNodeType() == Node.ELEMENT_NODE)
{
Element fstElmnt2 = (Element) resultNode;
NodeList nameList2 = fstElmnt2.getElementsByTagName("tns:congestion");
Element nameElement2 = (Element) nameList2.item(0);
nameList2 = nameElement2.getChildNodes();
Log.v("tns:congestion", ""+((Node) nameList2.item(0)).getNodeValue());
Element fstElmnt3 = (Element) resultNode;
NodeList nameList3 = fstElmnt3.getElementsByTagName("tns:direction");
Element nameElement3 = (Element) nameList3.item(0);
nameList3 = nameElement3.getChildNodes();
Log.v("tns:direction--", ""+((Node) nameList3.item(0)).getNodeValue());
}
}
}
}

You can you SAXParser to parse the xml. Hope the following links will be helpful:
developersite
basic tutorial

Related

XML Parsing For News Application

I have create news application rss feed on xml parsing for collage project
this is xml http://goo.gl/X8tIr1 so any one guide me for build that application or give code to help for collage project
Can Anyone give me the whole code
Go through Creating-a-simple-rss-application-in-android. This should get you started.
I'm giving you how to XML PArsing works in doInBackground. Try like this :
DOMParser dParser = new DOMParser();
String abc = dParser.getXmlFromUrl(params[0]);
Document doc = dParser.getDocElement(abc);
NodeList n1 = doc.getElementsByTagName("channel");
for (int i = 0; i < n1.getLength(); i++) {
Element e = (Element) n1.item(i);
NodeList nl1 = e.getElementsByTagName("item");
for (int j = 0; j < nl1.getLength(); j++) {
Element e1 = (Element) nl1.item(j);
NodeList ntitle = e1.getElementsByTagName(TITLE);
NodeList ndate = e1.getElementsByTagName(PUBDATE);
NodeList ndesc = e1.getElementsByTagName(DESCRIPTION);
for (int k = 0; k < n1.getLength(); k++) {
Element e2 = (Element) ntitle.item(k);
Element e3 = (Element) ndate.item(k);
Element e4 = (Element) ndesc.item(k);
Pojo pojo = new Pojo();
pojo.setTitle(getCharacterDataFromElement(e2));
pojo.setPubdate(getCharacterDataFromElement(e3));
pojo.setDescription(getCharacterDataFromElement(e4));
itemList.add(pojo);
}
}
}
return null;

Parsing a xml file in android

I have a xml file :
<root>
<book
name="Science1"
author="XYZ1">
</book>
<book
name="Science2"
author="XYZ2">
</book>
</root>
I want to get the value of name and author. Java code to parse the above :
Document doc = null;
try {
InputStream is = getResources().openRawResource(R.raw.xmldata);//newfile
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
doc = db.parse(new InputSource(is));
NodeList nl1 = doc.getElementsByTagName("book");
for (int i = 0; i < nl1.getLength(); i++) {
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
Element e = (Element) nl1.item(i);
// adding each child node to HashMap key => value
map.put(KEY_NAME, parser.getValue(e, KEY_NAME));
map.put(KEY_AUTHOR,parser.getValue(e, KEY_AUTHOR));
Log.d("Debug","Value + " + parser.getValue(e, KEY_NAME) + " " + parser.getValue(e, KEY_AUTHOR));
// adding HashList to ArrayList
menuItems.add(map);
}
}
catch(Exception e)
{
e.printStackTrace();
}
What I am missing here, as when I print the tag value, I don't get any value.
Please suggest / help how can I read this format ? If this format has any other dependency like schema / DTD to be provided, let me know, as I am totally unaware of the correct flow. Please suggest me some site as well where I can validate my xml file as well.
Bring the xml-File in this format:
<root>
<book name="Science1"
author="XYZ1"/>
<book name="Science2"
author="XYZ2" />
</root>
And than for your for-loop:
for (int temp = 0; temp < nl1.getLength(); temp++) {
HashMap<String, String> map = new HashMap<String, String>();
Node nNode = nl1.item(temp);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
map.put(KEY_NAME, eElement.getAttribute("name"));
map.put(KEY_AUTHOR, eElement.getAttribute("author"));
menuItems.add(map);
}
}
Hope it helps
Man, just read this tutorial:
http://developer.android.com/training/basics/network-ops/xml.html

Parse XML data from url using DOM Parser

I want to parse xml file from url :
http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist=cher&api_key=5d6ce941674603e4bb75cfad6cfa13b7
I want to parse following tags of the file :
<artist>
<name>Cher</name>
<image size="medium">http://userserve-ak.last.fm/serve/64/62286415.png</image>
</artist>
But i don't know how to get the value of these two tags only.
I have tried the example code from
http://www.androidhive.info/2011/11/android-xml-parsing-tutorial/
But it does not showing to parse same tag having different attribute value.
Can anyone guide me how this is done?
Thanx in advance.
from the link you provided, I have just extract a small part :
XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL); // getting XML
Document doc = parser.getDomElement(xml); // getting DOM element
NodeList nl = doc.getElementsByTagName("artist");
// looping through all item nodes <artist>
for (int i = 0; i < nl.getLength(); i++) {
Element e = (Element) nl.item(i);
String name = parser.getValue(e, "name"));
String image = parser.getValue(e, "image"));
//if you want the artist 'Cher' sigh ;)
if (name.equals("Cher")){
//do whatever you want
}
}
Thankx. I solved my problem from this url :
Getting element using attribute
if(str.equals("image"))
{
n = item.getElementsByTagName(str);
for (int i = 0; i < n.getLength(); i++) {
Node subNode = n.item(i);
if (subNode.hasAttributes()) {
NamedNodeMap nnm = subNode.getAttributes();
for (int j = 0; j < nnm.getLength(); j++) {
Node attrNode = nnm.item(j);
if (attrNode.getNodeType() == Node.ATTRIBUTE_NODE) {
Attr attribute = (Attr) attrNode;
if( attribute.getValue().equals("medium"))
{
return this.getElementValue(n.item(i));
}
}
}
}
}
}

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);
}

Easy way to get the node value of this example

I have a sample XML (Android platform) and I wanted to know the easiest and most efficient approach to get the node value of the node "e". Please help.
<a>
<b>
<c>
<e>data</e>
</c>
</b>
<b>
</b>
</a>
Use XPath.
See - http://developer.android.com/reference/javax/xml/xpath/package-summary.html
The XPath expression to grab the correct element would be:
/a/b/c/e
You could coalesce the resulting node into a String to get the textual value.
I think following code will help you to extract data of "e" node.
NodeList nodes = doc.getElementsByTagName("b");
for (int i = 0; i < nodes.getLength(); i++) {
Element element = (Element) nodes.item(i);
NodeList nodesimg = element.getElementsByTagName("e");
for (int j = 0; j < nodesimg.getLength(); j++) {
Element line = (Element) nodesimg.item(j);
String value=getCharacterDataFromElement(line);
}
}
public static String getCharacterDataFromElement(Element e) {
Node child = e.getFirstChild();
if (child instanceof CharacterData) {
CharacterData cd = (CharacterData) child;
return cd.getData();
}
return "?";
}
Implement Pull Parser, example is given here: http://icodesnip.com/snippet/java/android-pull-parser-sample
So by your case, you have to write the condition inside the start tag for "e".

Categories

Resources