2012-01-05 22 views
1

Я проанализировал свой файл xml успешно, но теперь я получаю нулевое значение. поэтому какая ошибка я делаю в своем кодировании, я не знаю. Я хочу показать мое строковое значение на моем экране. Теперь я пытаюсь показать, что значение строки в формате просмотра текста, но я получаю нулевое значение ......как решить ошибку парсера в моем приложении?

мой XML-файл:

<Mobiles> 
<Mobile> 
<Phone>Nokia 1108</Phone> 
<Network>GSM 900/1800 MHz</Network> 
<Size>106x46x20 mm</Size> 
<Ringtones>mono</Ringtones> 
<SMS>yes</SMS> 
<MMS>no</MMS> 
<Email>no</Email> 
<InstantMessaging >no</InstantMessaging> 
</Mobile> 

<Mobile> 
<Phone>Nokia 1109</Phone> 
<Network>GSM 900/1800 MHz</Network> 
<Size>106x46x20 mm</Size> 
<Ringtones>mono</Ringtones> 
<SMS>yes</SMS> 
<MMS>no</MMS> 
<Email>no</Email> 
<InstantMessaging >no</InstantMessaging> 
</Mobile> 

<Mobile> 
<Phone>Nokia 1110</Phone> 
<Network>GSM 900/1800 MHz</Network> 
<Size>106x46x20 mm</Size> 
<Ringtones>mono</Ringtones> 
<SMS>yes</SMS> 
<MMS>no</MMS> 
<Email>no</Email> 
<InstantMessaging >no</InstantMessaging> 
</Mobile> 

<Mobile> 
<Phone>Nokia 1111</Phone> 
<Network>GSM 900/1800 MHz</Network> 
<Size>106x46x20 mm</Size> 
<Ringtones>mono</Ringtones> 
<SMS>yes</SMS> 
<MMS>no</MMS> 
<Email>no</Email> 
<InstantMessaging >no</InstantMessaging> 
</Mobile> 
</Mobiles> 

выход: enter image description here

ответ

0

почему у вас есть истинный метод endElement?

if (localName.equals("Mobiles")) { 
       this.in_Mobiles = true; 

Это может привести к тому, что всегда будут отменены мобильные телефоны, а не задано правильное поле.

+0

жаль его моя ошибка теперь я изменил ложь теперь я получаю нулевой выход. – balaji

+0

, но Йенс правдив, так как вы всегда в_Мобилях, вы никогда не установите какое-либо другое поле. Если вы хотите, НЕ используйте инструкцию else, просто инструкцию if. – sodik

+0

в любом случае, вы получите только последние данные о мобильных устройствах, так как вы будете каждый раз перезаписывать данные в myParsedExampleDataSet. – sodik

1

Просто кратко взглянув на ваш код, я бы сказал, что проблема заключается в переходах состояния в вашу переменную in_Mobiles. Он всегда будет true с начала документа до конца.

В вашем методе characters(char[], int, int), первый условный переход, таким образом, потребляют все символы:

if (this.in_Mobiles) { 
    myParsedExampleDataSet.setMobiles(new String(ch, start, length)); 

Такое же поведение повторяется в использовании in_Mobile, что если зафиксировать первую, будет следующим преступником ,

Редактировать: Ну, в целом реализация вашего синтаксического анализа является отвратительной. Попробуйте что-то вроде этого:

Прежде всего, ваш ParsedExampleDataSet немного не работает.

Включите его в список мобильных объектов, а не, как это:

public class ParsedExampleDataSet extends ArrayList<Mobile>{ 
} 

Далее создайте класс компонента под названием Mobile, как это:

class Mobile { 
    private String Phone; 
    private String Network; 
    private String Size; 
    private String Ringtones; 
    private boolean SMS; 
    private boolean MMS; 
    private boolean Email; 
    private boolean InstantMessaging; 
    public String getPhone() { 
     return Phone; 
    } 
    public void setPhone(String phone) { 
     Phone = phone; 
    } 
    public String getNetwork() { 
     return Network; 
    } 
    public void setNetwork(String network) { 
     Network = network; 
    } 
    public String getSize() { 
     return Size; 
    } 
    public void setSize(String size) { 
     Size = size; 
    } 
    public String getRingtones() { 
     return Ringtones; 
    } 
    public void setRingtones(String ringtones) { 
     Ringtones = ringtones; 
    } 
    public boolean isSMS() { 
     return SMS; 
    } 
    public void setSMS(boolean sMS) { 
     SMS = sMS; 
    } 
    public boolean isMMS() { 
     return MMS; 
    } 
    public void setMMS(boolean mMS) { 
     MMS = mMS; 
    } 
    public boolean isEmail() { 
     return Email; 
    } 
    public void setEmail(boolean email) { 
     Email = email; 
    } 
    public boolean isInstantMessaging() { 
     return InstantMessaging; 
    } 
    public void setInstantMessaging(boolean instantMessaging) { 
     InstantMessaging = instantMessaging; 
    } 
} 

Наконец, ваш DefaultHandler подкласс нуждается в переработать. Что-то вроде этого должно работать.

class ExampleHandler extends DefaultHandler { 
    private ParsedExampleDataSet Mobiles; 
    private Mobile CurrentMobile; 
    private StringBuilder Characters; 
    public ParsedExampleDataSet getParsedExampleDataSet() { 
     return Mobiles; 
    } 
    public void startDocument() throws SAXException { 
     Mobiles = new ParsedExampleDataSet(); 
    } 
    public void startElement(String namespaceUri, String localName, String qName, Attributes atts) 
      throws SAXException { 
     String name = localName.equals("") ? qName : localName; 
     if ("Mobile".equals(name)) { 
      CurrentMobile = new Mobile(); 
     } 
     // Empty accumulated characters 
     Characters = null; 
    } 
    public void characters(char[] ch, int offset, int length) throws SAXException { 
     if (Characters == null) { 
      Characters = new StringBuilder(length); 
     } 
     Characters.append(ch, offset, length); 
    } 
    public void endElement(String namespaceUri, String localName, String qName) throws SAXException { 
     String name = localName.equals("") ? qName : localName; 
     if ("Mobile".equals(name)) { 
      Mobiles.add(CurrentMobile); 
      CurrentMobile = null; 
     } else if (CurrentMobile != null && Characters != null){ 
      String value = Characters.toString(); 
      if ("Phone".equals(name)) { 
       CurrentMobile.setPhone(value); 
      } else if ("Network".equals(name)) { 
       CurrentMobile.setNetwork(value); 
      } else if ("Size".equals(name)) { 
       CurrentMobile.setSize(value); 
      } else if ("Ringtones".equals(name)) { 
       CurrentMobile.setRingtones(value); 
      } else { 
       boolean yes = "yes".equalsIgnoreCase(value.trim()); 
       if ("SMS".equals(name)) { 
        CurrentMobile.setSMS(yes); 
       } else if ("MMS".equals(name)) { 
        CurrentMobile.setMMS(yes); 
       } else if ("Email".equals(name)) { 
        CurrentMobile.setEmail(yes); 
       } else if ("InstantMessaging".equals(name)) { 
        CurrentMobile.setInstantMessaging(yes); 
       } 
      } 
     } 
    } 
} 

И, просто запустив его, как это должно принести результат:

SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); 
ExampleHandler handler = new ExampleHandler(); 
InputSource is = new InputSource(/* your XML goes here as an inputstream or reader*/); 
parser.parse(is, handler); 
ParsedExampleDataSet mobiles = handler.getParsedExampleDataSet(); 
for (Mobile mobile : mobiles) { 
    System.out.println(mobile.getPhone()); 
} 
+0

Я изменил false, но все же я получаю только нулевое значение .... – balaji

+0

yup, в целом, что синтаксический анализатор немного выключен. попробуйте прилагаемый простой пример. В целом, возможно, вам следует использовать какую-то библиотеку xml-to-bean, такую ​​как [pulloid] (http://code.google.com/p/pulloid/) – Jens

+0

jens теперь я выполнил ваши инструкции, теперь мой вывод show Ошибка: null В чем проблема сейчас? см. полную ссылку на эту ссылку: 1. http://paste.org/43227 2. http://paste.org/43228 3. http: // paste.org/43229 – balaji

Смежные вопросы