<?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>这个节点要如何判断.

解决方案 »

  1.   

    用android自带的解析器  SAX  解析起来速度非常快   而且挺简单的   如果解析status为ok   就设置一个boolean  因为SAX是逐行解析的  如果为TRUE的话  就解析下一个  如果是FALSE  就return   这样就可以了   看下sdk的文档 
      

  2.   

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

  3.   

    用SAX工厂类生成它   然后定义DefaultHandler 定义解析XML的规则 
    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser parser = factory.newSAXParser();然后parser.pareser(xml的输入流,定义的解析规则handler);
      

  4.   

    直接上代码,用sax解析。主要在startElement
          characters
    这两个函数里面做数据的操作。        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);
            }
            
        }
      

  5.   

    SAX解析时,一行一行来.遇到一个元素就Startelement然后characters,然后Enelement,如果要设置一个对象,然后里面的属性分别是一个元素下的子元素如何处理啊.像这样:
    根元素:开始:有两个元素
    <elea>aaa</elea>
    <eleb>bbb</eleb>下面开始是item:
    <item>
    <elea>aa</elea>
    <eleb>bb</eleb>
    </item>
    <item>...</item>
    要得到一个ItemBean属性a,b怎么处理啊,目前只会用DOM,然后多层循环.
      

  6.   


    这个的确是个问题,不过我想这个xml应该是楼主自己定义,不会出现
    <elea data=aaa></elea>
    这样的情况吧。DOM有点慢啊,如果数据量小还是可以接受的。
      

  7.   

    DOM对于1K下的数据解析和SAX来比是没什么区别的.
      

  8.   

    为什么不会呢?没有属性,节点都是空属性的,
    是有的,其实是一个RSS一样的东西,然后在开头有一个<channel>下面的子节点:
    <title>,<date>然后下面的兄弟节点是<item>糟糕的是它里面也有<title>,<date>整体看上去是这样的:
    <channel>
    <title>bbb</title>
    <date>ddd</date>
    <item>
    <title>aa</title>
    <date>bb</date>
    还有其它东西..........
    </item>
    <item>...
    </item>
    ....
    </channel>
    用了DOM循环三四次是把东西弄出来了,可是这样总觉得不太好,
    用SAX不知道如何处理了,如果遇到的是item新建一个Bean然后把这个Bean留着(是局部变量),然后接着是item的子节点,然后一行一行处理,处理结束后这个Bean又被下一个item覆盖,,,,,
      

  9.   

    你如果是开发Android 干嘛那么费神 就用Android自带的SaxParser解析XML不就好了哇。
    写个帮助类;放那边想用就调。
      

  10.   


    <item>
     <id>1</id>
     <title><!CDATA[  含有换行和  空格
    的CDATA 
    ]></title>
    </item>
    SAX遇到不规则的CDATA就挂了