ANDROID:解析XML

ANDROID:解析XML,第1张

ANDROID:解析XML

我宁可不要使用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

希望对您有所帮助。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5083128.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存