SAX解析:如何获取子节点
我在android中使用SAX解析。 对于以下XML:
Game Analysis GTA ABC Sat, 21 Feb 2012 05:18:23 GMT CoD XYZ Sat, 21 Feb 2011 05:18:23 GMT
我需要获取
的第一次出现(正好在下面)。
然后从每个块我再次需要提取
。
我可以使用以下方法获取第一个
:public void startElement(String uri,String localName,String qName,Attributes attributes)抛出SAXException {if(qName.equals(“title”))…}
但是,我应该如何获取 block
内的标签?
以下是我使用SAX的方法。
我修改了你的XML文件。
XML文件
Game Analysis -
GTA ABC Sat, 21 Feb 2012 05:18:23 GMT -
CoD XYZ Sat, 21 Feb 2011 05:45:10 GMT -
AtV fgh Sat, 21 Feb 2011 06:20:10 GMT Game Analysis 2 -
GTA 2 ABC 2 Sat, 21 Feb 2012 04:18:23 GMT -
CoD 2 XYZ 2 Sat, 21 Feb 2011 04:45:10 GMT -
AtV 2 fgh Sat, 21 Feb 2011 05:20:10 GMT
实体
渠道
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; } }
附件
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; } }
处理器
的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; } }
经理
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; } }
主要的
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("------------------------"); } } } }
在控制台中输出
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 ------------------------
所以它有效;)
您使用堆栈(或类似)并记住您需要的任何内容。 SAX是基于事件的,因此您必须自行管理有关您所在位置的信息。 考虑这样的事情:
public Parser extends .... private Item item; private StringBuffer buffer; startElement(String uri,)...{ buffer = new StringBuffer(); } characters(...) { buffer.append(...); // sorry, coding by memory directly on SO, can't remember correct syntax. } endElement(String uri, String qName...) { if(qName.equals("item") { handleOldItem(); item = new Item(); } else if(qname.equals("title") { item.setTitle(buffer.toString()); } } }
SAX是这项工作的错误工具。 使用DOM和XPath可以轻松解决您的需求。
就地SAX解析器使用Dom解析器,下面是你的完整答案: –
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory .newInstance(); documentBuilderFactory.setCoalescing(true); DocumentBuilder documentBuilder = documentBuilderFactory .newDocumentBuilder(); Document document = documentBuilder.parse(new InputSource(is)); title = document.getElementsByTagName("title").item(0).getFirstChild().getNodeValue().trim(); itemList = document.getElementsByTagName("item"); for (int i = 0; i < itemList .getLength(); i++) { if(itemModel == null){ itemModel = new ItemModel(); } if(arrListItemModel==null){ arrListItemModel= new ArrayList(); } itemItem = (Element)itemList .item(i); itemModel.setTitle(itemItem .getElementsByTagName("title").item(0).getFirstChild().getNodeValue().trim()); itemModel.setDescription(itemItem .getElementsByTagName("description").item(0).getFirstChild().getNodeValue().trim()); itemModel.setPubDate(itemItem .getElementsByTagName("pubDate").item(0).getFirstChild().getNodeValue().trim()); itemModel.setEnclosure(itemItem .getElementsByTagName("enclosure ").item(0).getFirstChild().getNodeValue().trim()); arrListItemModel.add(tippsModel); itemModel =null; }