2012-05-21 6 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> 

내 색소폰 구문 분석 클래스 :

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() 메소드 (완료되면 버퍼를 클리어)에 처리를 둡니다.

관련 문제