How to get sub elements of an xml in android? - android

InputStream is = openHTTPConnection("blahblah");
DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
Document doc = null;
try {
builder = fac.newDocumentBuilder();
doc = builder.parse(is);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
doc.getDocumentElement().normalize();
NodeList parentNodes = doc.getElementsByTagName("Parent");
for (int i = 0; i < parentNodes.getLength(); i++){
Node itemNode = parentNodes.item(i);
if (itemNode.getNodeType() == Node.ELEMENT_NODE){
Element parentElement = (Element) itemNode;
NodeList childNodes = ??????
}
}
My XML file:
<Blah>
<Parent>
<Child>
...
</Child>
</Parent>
</Blah>
How can I get the sub element of Parent? The tutorial says NodeList childNodes = (parentElement).getElementsByTagName("Child"); But it does not make sense to me.
It looks like my post is mostly code; But I don't know what to add

Tutorial is correct. This is how you get it:
NodeList childNodes = (parentElement).getElementsByTagName("Child");
Element childElement=(Element)childNodes.item[0];
In case , there are multiple <child> nodes, you can loop through the iterator

In this way you can get sub elements of an xml in android
You could write a xsl
<xsl:template match="/">
<xsl:for-each select="section">
<xsl:value-of select="concat('link ',photo#id, ' from ',#name,' is ',photo#ilink)"><xsl:value-of>
</xsl:for-each>
</xsl:template>
run the xsl on your xml, the output will be link 1 from section1 is ImageLink 1 .. link 4 from section2 is ImageLink 2

Related

Writing to XML file in Android

I'm trying to write to an XML file, within my XML file I have:
<user>
<name></name>
</user>
And the method I can to write to the XML file:
public void WriteToXML() throws ParserConfigurationException, IOException, SAXException {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(inputStream);
Element element = doc.getDocumentElement();
element.normalize();
NodeList nList = doc.getElementsByTagName("user");
Node node = nList.item(0);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element2 = (Element) node;
if(element2.getTagName() == "name")
{
element2.setNodeValue("SFDSFSDF");
}
}
}
However, the method gets called but for some reason it doesnt actually write to the XML file because when I read it their isn't actually anything within the XML?
Try to replace :
element2.getTagName() == "name"
by :
(element2.getTagName()).equals("name")
Also, try to replace :
element2.setNodeValue("SFDSFSDF");
by :
element2.setTextContent("SFDSFSDF"); //adds content

Xml parsing in Android with XPath

Perhaps I'm going about this the wrong way, I'm trying to parse a gpx file, I've never parsed xml format in android before, I've tried a few different ways and can't seem to get any results.
The xml is at the bottom (a snippet its really long!). I want the trkpt nodes, actually the only data I need it lat, lon and time.
The last method I tired was using Xpath. It always returns an empty node list.
try {
InputSource inputSrc = new InputSource(context.getResources().openRawResource(R.raw.sample_track));
XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "//trkpt";
NodeList nodes = (NodeList)xpath.evaluate(expression, inputSrc, XPathConstants.NODESET);
also tried this:
private List<Location> decodeGPX(Context context) {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse(context.getResources().openRawResource(R.raw.sample_track));
Element elementRoot = document.getDocumentElement();
NodeList nodelist_trk = elementRoot.getElementsByTagName("trk");
for (int j = 0; j < nodelist_trk.getLength(); j++) {
Node node = nodelist_trk.item(j);
if (node.getNodeName().equals("trkseg")) {
NodeList trkpntList = node.getChildNodes();
XML:
<?xml version="1.0" ?>
<gpx>
<name><![CDATA[WassonPeak]]></name>
<desc><![CDATA[Wasson Peak is a classic hike in Saguaro National Park West. The destination is the high point of the Tucson Mountains at 4687 feet, Wasson peak. This map is of the eastern approach, from the trailhead at the end of Camino del Cerro.]]></desc>
<author><![CDATA[Scott Morris]]></author>
<email><![CDATA[smorris#topofusion.com]]></email>
<url><![CDATA[http://www.topofusion.com]]></url>
<urlname><![CDATA[TopoFusion Home Page]]></urlname>
<keywords><![CDATA[Wasson Saguaro West]]></keywords>
<bounds maxlat="32.288840" minlon="-111.150076" minlat="32.265301" maxlon="-111.120627"/>
<wpt lat="32.273882" lon="-111.147150">
<name><![CDATA[Wasson Peak]]></name>
<cmt><![CDATA[]]></cmt>
</wpt>
<wpt lat="32.288552" lon="-111.120627">
<name><![CDATA[Camino Del Cerro Trailhead]]></name>
<cmt><![CDATA[]]></cmt>
</wpt>
<wpt lat="32.265516" lon="-111.143047">
<name><![CDATA[Saddle]]></name>
<cmt><![CDATA[]]></cmt>
</wpt>
<trk>
<url><![CDATA[http://www.topofusion.com]]></url>
<urlname><![CDATA[TopoFusion Home Page]]></urlname>
<trkseg>
<trkpt lat="32.288668" lon="-111.120915">
<ele>847.058838</ele>
<time>2002-11-20T23:05:06Z</time>
</trkpt>
<trkpt lat="32.288668" lon="-111.120915">
<ele>847.539551</ele>
<time>2002-11-20T23:05:07Z</time>
</trkpt>
<trkpt lat="32.288668" lon="-111.120915">
<ele>847.058838</ele>
<time>2002-11-20T23:05:08Z</time>
</trkpt>
Your first one method is one of the way you can get the job done!
String path = "StringPath.xml";
InputStream is = new FileInputStream(new File(ruta));
InputSource inputSrc = new InputSource(is);
XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "//trkpt";
NodeList nodes = (NodeList)xpath.evaluate(expression, inputSrc, XPathConstants.NODESET);
for (int i=0; i < nodes.getLength(); i++){
NamedNodeMap node = nodes.item(i).getAttributes();
System.out.println(node.toString());
}
When I try the code with the xml above, I get 3 item on terminal

How can i parse XML using pull parser in Android

I have XML:
<?xml version="1.0" encoding="UTF-8"?>
<categories type="array">
<category>
<category_id>8</category_id>
<category_name>Công Nghệ & Xe</category_name>
<category_code>cong-nghe-xe</category_code>
<subcategory>
<category_id>59</category_id>
<category_name>Kiến trúc - thủ thuật</category_name>
<category_code>cong-nghe-xe_kien-thuc-thu-thuat</category_code>
</subcategory>
.................................................
</category>
.................................................
</categories>
How can I read it and fill ListView in Android, and what should I do : DOM , XML Parser or SAX ??
I prefer DOM for small little snippets like this.
String xml;
Document doc;
Element root = null;
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
doc = builder.parse( new InputSource( new StringReader( xml ) ) );
root = doc.getDocumentElement();
} catch ( Exception e ) {
// do something
}
if( root != null ) {
NodeList cats = root.getElementsByTagName( "category" );
for( int i=0; i < cats.getLength(); i++ ) {
Element category = (Element)cats.item( i );
....
}
}
Have you tried the example of Android?
http://developer.android.com/training/basics/network-ops/xml.html

how to edit xml text value?

i would like modify text of xml tag value i have used an xml as follows
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
here i would like to change the from name Jani as prasad.how can i chage that by using java code
i have written a java code as follows
try{
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(new File("/mnt/sdcard/one.xml"));
//Get the staff element by tag name directly
Node nodes = doc.getElementsByTagName("note").item(0);
//loop the staff child node
NodeList list = nodes.getChildNodes();
for (int i =0; i<list.getLength();i++){
Node node = list.item(i);
//get the salary element, and update the value
if("from".equals(nodes.getNodeName())){
node.setNodeValue("prasad");
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File("/mnt/sdcard/one.xml"));
transformer.transform(source, result);
}
}
}
catch (Exception e) {
e.printStackTrace();
}
There is problem in your code: "Jani" is a text node with parent element node "from". So you should change value of the text node.
...
for (int i =0; i<list.getLength();i++) {
Node node = list.item(i);
//get the salary element, and update the value
if("from".equals(node.getNodeName())){
Text text = (Text) ((Element) node).getChildNodes().item(0);
text.setNodeValue("prasad");
}
}
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File("/mnt/sdcard/one.xml"));
transformer.transform(source, result);
...
And I think RegExp would be much easier for this task
"your xml as string".replaceAll("<from>.*?</from>", "<from>prasad</from>");
There are several different examples available.
Writing XML on Android This seems to have the best samples.
Other hits:
How to rewrite or modify XML in android 2.1 version
Load and modify xml file in Android

parsing does not working in android

I am parsing a xml from an url.The url is has mobile IMEI no and searchstring based on my application. i put my xml parsing code in android project it does not work. but if i run as separate java program it is working. please help me.
Log.e("rsport-", "function1");
try{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setIgnoringComments(true);
factory.setCoalescing(true); // Convert CDATA to Text nodes
factory.setNamespaceAware(false); // No namespaces: this is default
factory.setValidating(false); // Don't validate DTD: also default
DocumentBuilder parser = factory.newDocumentBuilder();
Log.e("rsport-", "function2");
Document document = parser.parse("http://demo.greatinnovus.com/restingspot/search?userid=xxxxxxxxxxxxxxxx&firstname=a&lastname=a");
Log.e("rsport-","function3");
NodeList sections = document.getElementsByTagName("Searchdata");
int numSections = sections.getLength();
for (int i = 0; i < numSections; i++)
{
Element section = (Element) sections.item(i);
if(section.hasChildNodes()==true){
NodeList section1=section.getChildNodes();
for(int j=0;j<section1.getLength();j++){
if(section1.item(j).hasChildNodes()==true) {
for(int k=0;k<section1.item(j).getChildNodes().getLength();k++)
xmlvalue=String.valueOf(section1.item(j).getChildNodes().item(k).getNodeValue()).trim();
arl.add(xmlvalue);
}
}
}
}
}
}
catch(Exception e){}
System.out.println("id"+id+" searchdatacount"+searchdatacount);
System.out.println("---------");
ListIterator<String> litr = arl.listIterator();
while (litr.hasNext()) {
String element = litr.next();
Log.e("rsport-", "elememt");
}
after the Log.e("rsport-", "function2"); does not work.
Refer my blog, i had gave Detailed explanation, http://sankarganesh-info-exchange.blogspot.com/2011/04/parsing-data-from-internet-and-creating.html, and make sure , that you had add the Internet permission in your Manifest file.
If you had gone through Myblog, then you will able to notice that you did the following line as wrong
Document document = parser.parse("http://demo.greatinnovus.com/restingspot/search?userid=xxxxxxxxxxxxxxxx&firstname=a&lastname=a");
use like this
URL url =new URL("http://demo.greatinnovus.com/restingspot/search?userid=xxxxxxxxxxxxxxxx&firstname=a&lastname=a");
Document document= parser.parse(new InputSource(url.openStream()));

Categories

Resources