Saturday 11 November 2017

java - SAX parsing: how to fetch child nodes

itemprop="text">

I'm using SAX parsing in android. For
below XML:



            encoding="utf-8"?>



Game<br /> Analysis




GTA

ABC
Sat, 21 Feb 2012
05:18:23 GMT

url="http://URL.mp3" length="6670315"/>





CoD

XYZ
Sat, 21 Feb 2011
05:18:23 GMT

url="http://URL.mp3" length="6670315"/>








I
need to fetch the first occurance of </code> (just below<br /> ).</p><br/><br/><p>Then from every block I again need to extract<br /> <code><title> &<br /> <enclosure></code>.</p><br/><br/><p>I can fetch the<br /> first <code><title></code> using:<br/><br/> public void<br /> startElement(String uri, String localName, String qName,<br/> Attributes<br /> attributes) throws SAXException {<br/> if (qName.equals("title"))<br/><br /> ...<br/> }</p><br/><br/><br/><p>But, how should I<br /> fetch the tags inside <code><item> block</code>?</p><br/><br /> </div><div class="post-text" itemprop="text"> <div style="font-weight:<br /> bold;"><p class="normal">Answer</p><br /> <br/></div><br/><p>Here is how I've done that with<br /> SAX.</p><br/><br/><br/><p>I have modified a bite your XML<br /> file.</p><br/><br/><p><em>XML<br /> file</em></p><br/><br/><pre><code><?xml<br /> version="1.0" encoding="utf-8"?><br/><rss version="2.0"><br/><br /> <channel><br/> <title>Game<br /> Analysis



GTA


ABC
Sat, 21 Feb 2012
05:18:23 GMT

url="http://URL.mp3/1" length="6670315"/>





CoD

XYZ
Sat, 21 Feb 2011
05:45:10 GMT

url="http://URL.mp3/2" length="6670345"/>






AtV

fgh
Sat, 21 Feb 2011
06:20:10 GMT

url="http://URL.mp3/3" length="6670364"/>




Game Analysis<br /> 2




GTA 2
ABC
2

Sat, 21 Feb 2012 04:18:23
GMT

length="6670315"/>




CoD 2

XYZ 2
Sat, 21 Feb 2011
04:45:10 GMT

url="http://URL.mp3/2/2" length="6670345"/>





AtV<br /> 2
fgh

Sat, 21 Feb 2011 05:20:10 GMT
type="audio/mpeg" url="http://URL.mp3/2/3" length="6670364"/>








Entities



Channel



public
class Channel {

private String title;


private ArrayList alItems;


public
Channel(){}

public String getTitle() {
return
title;
}

public void setTitle(String title)
{
this.title = title;

}



public ArrayList getAlItems()
{
return alItems;
}


public void
setAlItems(ArrayList alItems) {
this.alItems =
alItems;

}


}



Enclosure



public
class Enclosure {

private String type;
private URL
url;
private Integer length;




public Enclosure(){}

public String getType() {
return
type;
}


public void setType(String type)
{
this.type = type;

}



public URL getUrl() {
return url;

}


public void setUrl(URL url) {
this.url =
url;

}


public Integer getLength()
{
return length;
}


public void
setLength(Integer length) {
this.length = length;


}




}


Item




public
class Item {

private String title;
private String
description;
private String pubDate;
private Enclosure
enclosure;

public Item(){}

public String
getTitle() {

return title;
}


public void setTitle(String title) {
this.title = title;

}

public String getDescription() {
return
description;
}


public void
setDescription(String description) {
this.description =
description;
}

public String getPubDate() {

return pubDate;
}

public void setPubDate(String
pubDate) {

this.pubDate = pubDate;

}

public Enclosure getEnclosure() {
return
enclosure;
}

public void setEnclosure(Enclosure
enclosure) {
this.enclosure = enclosure;

}




}


Handler



ChannelHandler




public
class ChannelHandler extends DefaultHandler{

private
ArrayList alChannels;
private Channel channel;

private String reading;

private ArrayList
alItems;
private Item item;
private Enclosure
enclosure;

public ChannelHandler(){


super();
}

@Override
public void
startElement(String uri, String localName, String qName,
Attributes
attributes) throws SAXException {


if(qName.equals("rss")){
alChannels = new ArrayList<>();

}

else if(qName.equals("channel")){
channel = new
Channel();
}
else if(qName.equals("item")){
item = new
Item();
}
else
if(qName.equals("enclosure")){

enclosure = new
Enclosure();

enclosure.setType(attributes.getValue("type"));

try {

enclosure.setUrl(new URL(attributes.getValue("url")));
} catch
(MalformedURLException e) {
// TODO Auto-generated catch block

e.printStackTrace();
}


enclosure.setLength(Integer.parseInt(attributes.getValue("length")));


}


}

@Override
public
void endElement(String uri, String localName, String qName)
throws
SAXException {

if(qName.equals("channel")){

channel.setAlItems(alItems);
alChannels.add(channel);


alItems = null;
}
if(qName.equals("title")){


if(alItems == null){
channel.setTitle(reading);
alItems = new
ArrayList<>();
}
else if(item != null) {

item.setTitle(reading);

}

}
else
if(qName.equals("item")){

if(alItems != null){

alItems.add(item);
item = null;
}



}
else if(qName.equals("description")){

item.setDescription(reading);
}
else
if(qName.equals("pubDate")){
item.setPubDate(reading);

}
else if(qName.equals("enclosure")){

item.setEnclosure(enclosure);
}



}

@Override
public void characters(char[] ch, int
start, int length)
throws SAXException {
reading = new String(ch,
start, length);
}

public ArrayList
getAlChannels() {

return alChannels;

}


}


Manager



XMLManager




public
final class XMLManager {


public static
ArrayList getAlChannels(){
ArrayList alChannels
= null;
SAXParserFactory factory = SAXParserFactory.newInstance();

try {
SAXParser parser = factory.newSAXParser();
File file = new
File("D:\\Loic_Workspace\\TestSAX2\\res\\test.xml");


ChannelHandler channelHandler = new ChannelHandler();
parser.parse(file,
channelHandler);
alChannels = channelHandler.getAlChannels();
}
catch (ParserConfigurationException e) {
// TODO Auto-generated catch
block
e.printStackTrace();
} catch (SAXException e) {

// TODO Auto-generated catch block
e.printStackTrace();
} catch
(IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();
}
return alChannels;

}

}


The
main




MyMain



public
class MyMain {

/**
* @param args

*/
public static void main(String[] args) {



Enclosure enclosure = null;
for(Channel channel :
XMLManager.getAlChannels()){
System.out.println("Channel title :
"+channel.getTitle());

System.out.println("------------------------");
for(Item
i:channel.getAlItems()){
System.out.println(i.getTitle());

System.out.println(i.getPubDate());
System.out.println("Enclosure :
");
enclosure = i.getEnclosure();

System.out.println(enclosure.getType());


System.out.println(enclosure.getUrl());

System.out.println(enclosure.getLength());

System.out.println("------------------------");
}

}





}


}


Output
in the
console



Channel
title : Game Analysis
------------------------
GTA
Sat, 21
Feb 2012 05:18:23 GMT

Enclosure :

audio/mpeg
http://URL.mp3/1
6670315
------------------------
CoD
Sat,
21 Feb 2011 05:45:10 GMT
Enclosure :

audio/mpeg
http://URL.mp3/2

6670345
------------------------
AtV
Sat,
21 Feb 2011 06:20:10 GMT
Enclosure :

audio/mpeg
http://URL.mp3/3
6670364
------------------------
Channel
title : Game Analysis 2

------------------------
GTA
2
Sat, 21 Feb 2012 04:18:23 GMT
Enclosure :

audio/mpeg
http://URL.mp3/2/1
6670315
------------------------
CoD
2
Sat, 21 Feb 2011 04:45:10 GMT

Enclosure :

audio/mpeg
http://URL.mp3/2/2
6670345
------------------------
AtV
2
Sat, 21 Feb 2011 05:20:10 GMT
Enclosure :

audio/mpeg
http://URL.mp3/2/3

6670364
------------------------


So
it works ;)


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...