我宁可不要使用DOM,因为它具有更大的内存空间。使用DOM,首先将整个XML结构加载到内存中,然后对其进行处理。这可能不是移动开发的最佳解决方案。
使用Android随附的SAX解析器。这是一种事件驱动的方法。每个开始标签,标签之间的内容以及结束标签都会在它们发生时触发事件。实际上,它可以处理更多事件,但那些是最常用的事件。这意味着SAX解析器将逐行处理每一行,而无需先将整个XML结构加载到内存中。
我明天将为您的特定问题提供示例。
编辑:这是承诺的内容处理程序示例。
import java.util.HashMap;import org.xml.sax.Attributes;import org.xml.sax.ContentHandler;import org.xml.sax.Locator;import org.xml.sax.SAXException;public class MyContentHandler implements ContentHandler { private HashMap<String, Object> feed; private HashMap<String, Object> peroidContent; private HashMap<String, Object> callContent; private HashMap<String, Object> callsMap; private HashMap<String, Object> lineContent; private HashMap<String, Object> linesMap; private String text; private String callId; private String lineId; @Override public void startdocument() throws SAXException { feed = new HashMap<String, Object>(); } @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { // Gets called every time an opening tag is encountered. if(localName.equalsIgnoreCase("FEED")) { feed.put("Version", atts.getValue("version")); } else if(localName.equalsIgnoreCase("PEROID")) { peroidContent = new HashMap<String, Object>(); peroidContent.put("From", atts.getValue("from")); peroidContent.put("to", atts.getValue("to")); } else if(localName.equalsIgnoreCase("LINE")) { linesMap = new HashMap<String, Object>(); } else if(localName.equalsIgnoreCase("LINE")) { lineContent = new HashMap<String, Object>(); lineId = atts.getValue("id"); lineContent.put("name", atts.getValue("name")); lineContent.put("shortname", atts.getValue("shortname")); lineContent.put("status", atts.getValue("status")); } else if(localName.equalsIgnoreCase("CALLS")) { callsMap = new HashMap<String, Object>(); } else if(localName.equalsIgnoreCase("CALL")) { callContent = new HashMap<String, Object>(); callId = atts.getValue("Id"); callContent.put("created", atts.getValue("created")); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { text = new String(ch, start, length); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // Gets called every time a closing tag is encountered. if(localName.equalsIgnoreCase("FEED")) { feed.put("Peroid", peroidContent); } else if(localName.equalsIgnoreCase("PEROID")) { peroidContent.put("Lines", linesMap); } else if(localName.equalsIgnoreCase("LINES")) { linesMap.put(lineId, lineContent); } else if(localName.equalsIgnoreCase("LINE")) { lineContent.put("Calls", callsMap); } else if(localName.equalsIgnoreCase("CALLS")) { callsMap.put(callId, callContent); } else if(localName.equalsIgnoreCase("BOOKING")) { callContent.put("Booking", text.toString()); } } @Override public void enddocument() throws SAXException { SAXParsingFun.setHashMap(feed); } @Override public void endPrefixMapping(String prefix) throws SAXException { // TODO Auto-generated method stub } @Override public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub } @Override public void processingInstruction(String target, String data) throws SAXException { // TODO Auto-generated method stub } @Override public void setdocumentLocator(Locator locator) { // TODO Auto-generated method stub } @Override public void skippedEntity(String name) throws SAXException { // TODO Auto-generated method stub } @Override public void startPrefixMapping(String prefix, String uri) throws SAXException { // TODO Auto-generated method stub }}
关于StackOverflow,有很多关于如何解析XML文件的解释,我省略了,只是向您展示了更有趣的部分。内容处理程序。
现在,对大多数有趣的部分都进行了评论,以便您了解我正在尝试做的事情。
我已经实现了该接口,
ContentHandler只是为了向您显示有更多可用的方法,也许将来您会需要其中一种。但是,您可以
DefaultHandler改为从类扩展而仅覆盖所需的方法。您要做的基本上就是检查某些标签的发生,然后在此之后触发某些事件。如果要保留XML文件中元素的顺序,则只需使用a
linkedHashMap而不是a
HashMap。
希望对您有所帮助。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)