Я использую SimpleXML для Java для анализа ответа XML на сопоставление классов Java. Тем не менее, я не могу получить эту деталь, работающую с моим устройством Android.
Мой XML-фрагмент выглядит так,
<t:EmailAddresses> <t:Entry Key="EmailAddress1">sip:xxx@abs.com</t:Entry> <t:Entry Key="EmailAddress2">smtp:xxx@abs.com</t:Entry> <t:Entry Key="EmailAddress3">SMTP:xxx@abs.com</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; } }
И мой класс Entry выглядит так,
@Element public class Entry { @Attribute private String Key; public String getKey() { return Key; } public void setKey(String key) { Key = key; } }
Когда я разбираю запуск анализатора, я получаю только ключи, а также получаю ошибку «Несколько корневых элементов» при попытке проанализировать все 3 в классе List of Entry.
Может кто-нибудь, пожалуйста, укажите мне в правильном направлении? Благодаря !!
Примечание. Пространство имен XML «t» определено правильно.
Вот некоторые вещи, которые вы должны изменить:
Класс 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 содержит текст (= значение элемента, например «sip: …» ), для этого также требуется сопоставление. Если текст является необязательным, вы можете использовать @Text(required = false)
чтобы указать это. СОВЕТ. Создайте экземпляр вашего списка, заполните его записями и сериализуйте его, например, в файл. Таким образом, вы можете увидеть, соответствует ли соответствие вашим ожиданиям, и где вам нужно внести некоторые исправления.
Не можете ли вы использовать атрибуты для извлечения данных? Вот фрагмент из приложения для чтения RSS-каналов, которое аналогично анализирует XML:
if (localName.equals("channel")) { /** Get attribute value */ String attr = attributes.getValue("category"); itemList.setTitle(attr); }