<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Game Analysis</title>
<item>
<title>GTA</title>
<description>ABC</description>
<pubDate>Sat, 21 Feb 2012 05:18:23 GMT</pubDate>
<enclosure type="audio/mpeg" url="http://URL.mp3" length="6670315"/>
</item>
<item>
<title>CoD</title>
<description>XYZ</description>
<pubDate>Sat, 21 Feb 2011 05:18:23 GMT</pubDate>
<enclosure type="audio/mpeg" url="http://URL.mp3" length="6670315"/>
</item>
</channel>
</rss>
我可以使用以下方法获取第一个
但是,我应该如何获取
中的标记呢?
下面是我如何使用SAX实现这一点的。
我修改了你的XML文件。
XML文件
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Game Analysis</title>
<item>
<title>GTA</title>
<description>ABC</description>
<pubDate>Sat, 21 Feb 2012 05:18:23 GMT</pubDate>
<enclosure type="audio/mpeg" url="http://URL.mp3/1" length="6670315"/>
</item>
<item>
<title>CoD</title>
<description>XYZ</description>
<pubDate>Sat, 21 Feb 2011 05:45:10 GMT</pubDate>
<enclosure type="audio/mpeg" url="http://URL.mp3/2" length="6670345"/>
</item>
<item>
<title>AtV</title>
<description>fgh</description>
<pubDate>Sat, 21 Feb 2011 06:20:10 GMT</pubDate>
<enclosure type="audio/mpeg" url="http://URL.mp3/3" length="6670364"/>
</item>
</channel>
<channel>
<title>Game Analysis 2</title>
<item>
<title>GTA 2</title>
<description>ABC 2</description>
<pubDate>Sat, 21 Feb 2012 04:18:23 GMT</pubDate>
<enclosure type="audio/mpeg" url="http://URL.mp3/2/1" length="6670315"/>
</item>
<item>
<title>CoD 2</title>
<description>XYZ 2</description>
<pubDate>Sat, 21 Feb 2011 04:45:10 GMT</pubDate>
<enclosure type="audio/mpeg" url="http://URL.mp3/2/2" length="6670345"/>
</item>
<item>
<title>AtV 2</title>
<description>fgh</description>
<pubDate>Sat, 21 Feb 2011 05:20:10 GMT</pubDate>
<enclosure type="audio/mpeg" url="http://URL.mp3/2/3" length="6670364"/>
</item>
</channel>
</rss>
public class Channel {
private String title;
private ArrayList<Item> alItems;
public Channel(){}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public ArrayList<Item> getAlItems() {
return alItems;
}
public void setAlItems(ArrayList<Item> alItems) {
this.alItems = alItems;
}
}
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;
}
}
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;
}
}
通道处理程序
public class ChannelHandler extends DefaultHandler{
private ArrayList<Channel> alChannels;
private Channel channel;
private String reading;
private ArrayList<Item> 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<Channel> getAlChannels() {
return alChannels;
}
}
经理
XMLManager
public final class XMLManager {
public static ArrayList<Channel> getAlChannels(){
ArrayList<Channel> 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;
}
}
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("------------------------");
}
}
}
}
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
------------------------
问题内容: 给出了这个XML代码段 在SAX中,很容易获得属性值: 但是要获得文本节点的值,例如标签的值,这是很难的… 我不确定以上示例是否有效,您如何看待这种方法? 有没有更好的办法?(获取文本节点的值) 问题答案: 这是使用SAX的通常方法。 只是要注意每个标签可能被调用多次。这是一个完整的例子。 否则,您可以尝试使用StAX。
首先,我认为这个错误是因为一个确切的文件。但是错误发生在不同的文件在不同的时间。如何使SAX解析器停止连接到Internet?
问题内容: 它很好用,但是我希望它返回一个包含所有字符串的数组,而不是最后一个元素返回一个字符串。 任何想法如何做到这一点? 问题答案: 因此,你想构建一个XML解析器来解析这样的RSS feed。 现在,你可以使用两个SAX实现。你可以使用org.xml.sax或android.sax实现。在发布简短的示例后,我将解释两者的优点和缺点。 android.sax Implementation 让我
问题内容: 它很好用,但是我希望它返回一个包含所有字符串的数组,而不是最后一个元素返回一个字符串。 任何想法如何做到这一点? 问题答案: 因此,你想构建一个XML解析器来解析这样的RSS feed。 现在,你可以使用两个SAX实现。你可以使用org.xml.sax或android.sax实现。在发布简短的示例后,我将解释两者的优点和缺点。 android.sax实现 让我们从实现开始。 你首先必须
问题内容: 我正在用SAX解析XML文件,有时需要元素的内部XML。例如,对于以下XML 我需要获取元素 a 的内部XML ,这将是 最简单的方法是什么? 谢谢。 伊万 问题答案: 对于这种情况,我建议使用2个内容处理程序。第一个负责查找文档的相关部分,第二个负责处理内容。我对类似问题的答案(请参见下面的链接)演示了如何实现此方法: 使用SAX解析常见的XML元素
问题内容: 我需要解析一个XML流。由于我只需要做一次就可以构建我的java对象,因此SAX看起来很自然。我正在扩展DefaultHandler并实现startElement,endElement和character方法,在我的类中具有保存当前读取值(在characters方法中使用)的成员。 我可以轻松完成所需的工作,但是我的代码变得相当复杂,并且我确信没有理由这样做,并且我可以做不同的事情。我