当前位置: 代码迷 >> Android >> 简单解析XML解决方案
  详细解决方案

简单解析XML解决方案

热度:398   发布时间:2016-05-01 22:30:23.0
简单解析XML
XML code
<?xml version="1.0" encoding="utf-8" ?> - <info>  <status>ok</status>   <error /> - <item>  <uid>819789</uid>    <show>好的</show>   <email />   </item>  </info>- <item>  <uid>819780</uid>    <show>好的2</show>   <email>[email protected]<email>  </item>- <item>  <uid>819720</uid>    <show>好的3</show>    </item>  </info>


如果status为ok的情况下,就读取item的属性

采用org.w3c.dom解析.
刚学JAVA.在XML上就有问题了.上网找了些.呵呵.主要是对于例如<email /> 的值为空或者没有<email>这个节点要如何判断.


------解决方案--------------------
用android自带的解析器 SAX 解析起来速度非常快 而且挺简单的

如果解析status为ok 就设置一个boolean 因为SAX是逐行解析的 如果为TRUE的话 就解析下一个 如果是FALSE 就return 这样就可以了 看下sdk的文档
------解决方案--------------------
用SAX工厂类生成它 然后定义DefaultHandler 定义解析XML的规则 
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();

然后parser.pareser(xml的输入流,定义的解析规则handler);

探讨
用SAX一定要BaseFeedParser嘛?
这样有什么好处呢?
不能直接就new 一个对象.然后读取某个字节的数据这样吗?
看了好多.有点晕.呵呵.

------解决方案--------------------
直接上代码,用sax解析。

主要在startElement
characters
这两个函数里面做数据的操作。

Java code
        mButton.setOnClickListener(new OnClickListener() {                        @Override            public void onClick(View v) {                DefaultHttpClient client = new DefaultHttpClient();                HttpPost httpPost = new HttpPost(url);                HttpResponse response = null;                try {                    response = client.execute(httpPost);                } catch (ClientProtocolException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                                String str = null;                try {                    str = EntityUtils.toString(response.getEntity());                } catch (ParseException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                                StringReader reader = new StringReader(str);                InputSource source = new InputSource(reader);                try {                    SAXParserFactory factory = SAXParserFactory.newInstance();                    SAXParser paser = factory.newSAXParser();                    XMLReader xmlReader = paser.getXMLReader();                    DecodeHandler handler = new DecodeHandler();                    xmlReader.setContentHandler(handler);                    xmlReader.parse(source);                } catch (Exception e) {                    // TODO: handle exception                }            }        });            }        public class DecodeHandler extends DefaultHandler{        @Override        public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {            // TODO Auto-generated method stub            super.ignorableWhitespace(ch, start, length);        }        @Override        public void notationDecl(String name, String publicId, String systemId) throws SAXException {            // TODO Auto-generated method stub            super.notationDecl(name, publicId, systemId);        }        @Override        public void processingInstruction(String target, String data) throws SAXException {            // TODO Auto-generated method stub            super.processingInstruction(target, data);        }        @Override        public InputSource resolveEntity(String publicId, String systemId) throws IOException,                SAXException {            // TODO Auto-generated method stub            return super.resolveEntity(publicId, systemId);        }        @Override        public void startPrefixMapping(String prefix, String uri) throws SAXException {            // TODO Auto-generated method stub            super.startPrefixMapping(prefix, uri);        }        @Override        public void unparsedEntityDecl(String name, String publicId, String systemId,                String notationName) throws SAXException {            // TODO Auto-generated method stub            super.unparsedEntityDecl(name, publicId, systemId, notationName);        }        @Override        public void warning(SAXParseException e) throws SAXException {            // TODO Auto-generated method stub            super.warning(e);        }        @Override        public void characters(char[] ch, int start, int length) throws SAXException {            // TODO Auto-generated method stub            super.characters(ch, start, length);        }        @Override        public void endDocument() throws SAXException {            // TODO Auto-generated method stub            super.endDocument();        }        @Override        public void endElement(String uri, String localName, String qName) throws SAXException {            // TODO Auto-generated method stub            super.endElement(uri, localName, qName);        }        @Override        public void endPrefixMapping(String prefix) throws SAXException {            // TODO Auto-generated method stub            super.endPrefixMapping(prefix);        }        @Override        public void setDocumentLocator(Locator locator) {            // TODO Auto-generated method stub            super.setDocumentLocator(locator);        }        @Override        public void skippedEntity(String name) throws SAXException {            // TODO Auto-generated method stub            super.skippedEntity(name);        }        @Override        public void startDocument() throws SAXException {            // TODO Auto-generated method stub            super.startDocument();        }        @Override        public void startElement(String uri, String localName, String qName, Attributes attributes)                throws SAXException {            // TODO Auto-generated method stub            super.startElement(uri, localName, qName, attributes);        }            }
  相关解决方案