2014-01-07 3 views
3

Я использую SimpleXML для Java для анализа ответа XML на сопоставление классов Java. Тем не менее, я не могу получить эту деталь, работающую с моим устройством Android.SimpleXML Java - чтение значения в корневом элементе

Мой фрагмент XML выглядит следующим образом,

  <t:EmailAddresses> 
       <t:Entry Key="EmailAddress1">sip:[email protected]</t:Entry> 
       <t:Entry Key="EmailAddress2">smtp:[email protected]</t:Entry> 
       <t:Entry Key="EmailAddress3">SMTP:[email protected]</t:Entry> 
      </t:EmailAddresses> 

и мое определение класса для EmailAddresses выглядит так,

@Root 
    public class EmailAddresses 
    { 
     @ElementList 
     private List<Entry> Entry; 

     public List<Entry> getEntry() { return Entry; } 
     public void setEntry(List<Entry> entry) { Entry = entry; } 
    } 

И мой класс входа выглядит так,

@Element 
    public class Entry 
    { 
     @Attribute 
     private String Key; 

     public String getKey() { return Key; } 
     public void setKey(String key) { Key = key; } 
    } 

когда я анализирую запуск парсера, я получаю только ключи, а также получаю ошибку «Несколько корневых элементов» wh en, пытаясь разобрать все 3 в класс List of Entry.

Может кто-нибудь указать мне в правильном направлении? Благодаря !!

Примечание: пространство имен XML «t» определено правильно.

+0

Хороший вопрос, +1. – ollo

ответ

6

Вот некоторые вещи, которые вы должны изменить:

Класс EmailAddresses

@Root(name = "EmailAddresses") /* 1 */ 
@Namespace(prefix = "t", reference = "INSERT YOUR REFERENCE HERE!") /* 2 */ 
public class EmailAddresses 
{ 
    @ElementList(inline = true) /* 3 */ 
    private List<Entry> Entry; 

    // ... 
} 

Объяснение:

  • /* 1 */: Задайте имя элемента (с учетом регистра); простой делает это по умолчанию, но вы можете убедиться, что это действительно правильно.
  • /* 2 */: Установить пространство имен и ссылку; требуется для t в вашем XML.
  • /* 3 */: Ввести список; элемент <t:EmailAddresses> построен из элемента @Root(), все записи следуют за встроенными элементами. В противном случае список создаст еще один элемент в качестве дочернего, , завернув его в записи.

Класс Entry

@Root(name = "Entry") /* 1 */ 
@Namespace(prefix = "t", reference = "INSERT YOUR REFERENCE HERE!") /* 2 */ 
public class Entry 
{ 
    @Text 
    private String text; /* 3 */ 
    @Attribute 
    private String Key; 

    // ... 
} 

Объяснение:

  • /* 1 */: Не используйте @Element здесь, используйте @Root().
  • /* 2 */: Как # 2 выше.
  • /* 3 */: Ваш Entry -tags в XML содержат текст (= значение элемента, как "глотка: ..."), те требуют сопоставления тоже. Если текст не является обязательным, вы можете использовать @Text(required = false), чтобы указать это.

СОВЕТ: Создать экземпляр вашего списка, заполнить его с записями и сериализовать его, например, в файл. Таким образом, вы можете увидеть, соответствует ли соответствие вашим ожиданиям, и где вам нужно внести некоторые исправления.

+0

Я собираюсь попробовать это @ollo .. Я вернусь к вам. Благодаря !! –

+0

Спасибо, приятель, это сработало :) –

0

Можете ли вы использовать атрибуты для извлечения данных? Вот отрывок из считывающего приложение RSS-каналов, который разбирает XML аналогично:

if (localName.equals("channel")) 
{ 
    /** Get attribute value */ 
    String attr = attributes.getValue("category"); 
    itemList.setTitle(attr); 
} 
+0

Как это вписывается в мой XML-фрагмент? Ну .. это выше код с SimpleXML ?? –

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