2012-05-21 62 views
0

我想解析XML资源,但我无法。萨克斯在黑莓解析

的xml文件看起来是这样的:

<?xml version="1.0" encoding="UTF-8" ?> 
    <elencoanagrafiche trovati="7" errStatus="0"> 
     <anagrafica> 
      <idAnagrafica>75</idAnagrafica> 
      <nome><![CDATA[Alberto]]></nome> 
      <cognome><![CDATA[Pippo]]></cognome> 
      <email><![CDATA[[email protected]]]></email> 
      <dataDiNascita><![CDATA[26/07/1478]]></dataDiNascita> 
     </anagrafica> 
     <anagrafica> 
     . 
     . 
     </anagrafica> 
    </elencoanagrafiche> 

我的SAX解析类:

package mypackage; 

import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.Reader; 

import net.rim.device.api.ui.Field; 
import net.rim.device.api.ui.FieldChangeListener; 
import net.rim.device.api.ui.UiApplication; 
import net.rim.device.api.ui.component.ButtonField; 
import net.rim.device.api.ui.component.Dialog; 
import net.rim.device.api.ui.component.LabelField; 
import net.rim.device.api.ui.component.RichTextField; 
import net.rim.device.api.ui.container.HorizontalFieldManager; 
import net.rim.device.api.ui.container.MainScreen; 
import net.rim.device.api.xml.parsers.SAXParser; 
import net.rim.device.api.xml.parsers.SAXParserFactory; 

import org.xml.sax.Attributes; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

public class XMLSAXParser extends MainScreen { 

    private ButtonField _bIndietro = null; 
    private UiApplication _uiApp; 
    LabelField lbLine = new LabelField("-------------"); 

    public XMLSAXParser() { 

     //setup della pagina(layout, bottoni, text) 
     add(new RichTextField(ConnectionClass.url)); 

     _bIndietro = new ButtonField("Indietro", Field.FIELD_HCENTER | ButtonField.CONSUME_CLICK); 
     _bIndietro.setChangeListener(new FieldChangeListener() { 
      public void fieldChanged(Field field, int context) { 
       ConnectionClass.connect(); 
       _uiApp.popScreen(XMLSAXParser.this); 
      } 
     }); 

     add(_bIndietro); 

     _uiApp = UiApplication.getUiApplication(); 

     try { 

      SAXParserFactory factory = SAXParserFactory.newInstance(); 
      SAXParser saxParser = factory.newSAXParser(); 

      DefaultHandler handler = new DefaultHandler() { 

       boolean bidAnagrafica, belencoanagrafiche = false; 
       boolean bname, banagrafica = false; 
       boolean bcognome = false; 

       public void startElement(String uri, String localName, String qName, Attributes attributes) 
         throws SAXException { 

        System.out.println("Start Element :" + qName); 

        if (qName.equalsIgnoreCase("elencoanagrafiche")) { 
         belencoanagrafiche = true; 
        } 
        if (qName.equalsIgnoreCase("anagrafica")) { 
         banagrafica = true;     
        } 
        if (qName.equalsIgnoreCase("idAnagrafica")) { 
         bidAnagrafica = true; 
        } 
        if (qName.equalsIgnoreCase("nome")) { 
         bname = true;      
        } 
        if (qName.equalsIgnoreCase("cognome")) { 
         bcognome = true; 
        } 
       } 

       public void endElement(String uri, String localName, String qName) throws SAXException { 
        System.out.println("End Element :" + qName);    
       } 

       public void characters(char ch[], int start, int length) throws SAXException { 

        if (belencoanagrafiche) { 
         LabelField lb = new LabelField("elencoanagrafiche : " + new String(ch, start, length)); 
         HorizontalFieldManager sr = new HorizontalFieldManager(); 
         sr.add(lb); 
         add(sr); 
         belencoanagrafiche = false; 
        } 

        if (banagrafica) { 
         LabelField lb = new LabelField("anagrafica : " + new String(ch, start, length)); 
         HorizontalFieldManager sr = new HorizontalFieldManager(); 
         sr.add(lb); 
         add(sr); 
         add(new LabelField("-----")); 
         banagrafica = false; 
        } 

        if (bidAnagrafica) { 
         LabelField lb = new LabelField("idAnagrafica : " + new String(ch, start, length)); 
         HorizontalFieldManager sr = new HorizontalFieldManager(); 
         sr.add(lb); 
         add(sr); 
         bidAnagrafica = false; 
        } 

        if (bname) { 
         LabelField lb = new LabelField("Nome :" + new String(ch, start, length)); 
         HorizontalFieldManager sr = new HorizontalFieldManager(); 
         sr.add(lb); 
         add(sr); 
         bname = false; 
        } 

        if (bcognome) { 
         LabelField lb = new LabelField("Cognome : " + new String(ch, start, length)); 
         HorizontalFieldManager sr = new HorizontalFieldManager(); 
         sr.add(lb); 
         add(sr); 
         bcognome = false; 
        } 
       } 

      }; 


      InputStream inputStream = ConnectionClass.httpConn.openInputStream(); 
      Reader reader = new InputStreamReader(inputStream,"UTF-8"); 

      InputSource is = new InputSource(reader); 
      is.setEncoding("UTF-8"); 

      //InputStream inputStream = ConnectionClass.httpConn.openInputStream(); 

      saxParser.parse(inputStream, handler); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      Dialog.alert("Exception Error: " + e.toString()); 
     } 
    } 
} 

现在我的问题是,我没有得到这样的名字,cognome,电子邮件的任何元素值,等我只是得到身份证鉴定人,但我没有得到的数据。所以我的问题是如何获得CDATA内的数据?

回答

0

我的猜测是:characters()方法被多次调用,第一次调用时会得到一个空字符串,并将布尔标志设置为false。 你应该在后面的字符()调用,这样使用一个StringBuffer:

private StringBuffer buffer = new StringBuffer(); 

... 

public void characters(final char[] ch, final int start, final int length) throws SAXException 
{ 
    buffer.append(new String(ch, start, length).trim()); 
} 

而离开处理到的endElement()方法(在完成时清除缓存)。