2014-12-12 2 views
0

Я привязан к использованию XmlPullParser (поскольку мы используем библиотеку Smack XMPP). Но очень неудобно разбирать XML с ним и помещать прочитанные значения в beans (по крайней мере, если XSD задан). В отличие от JAXB было бы намного легче работать.XmlPullParser: получить/восстановить raw XML

Также для сериализации это «старомодный подход, основанный на ошибках», чтобы объединить строки вручную. (см. мотивацию http://babbler-xmpp.blogspot.co.at/2014_01_01_archive.html, которая также суммирует минусы).

Но для использования JAXB для десериализации я должен получить необработанную XML-строку. Конечно, одним из способов было бы восстановить всю XML-строку, используя методы анализа XML XmlPullParser (например, getName(), getText(), getAttributes(), ...). Но я хотел бы избежать этого.

Возможно ли получить всю необработанную XML-строку определенного тега (например, где сейчас указывает XmlPullParser)? Или кто-нибудь знает какую-нибудь утилиту, которая восстанавливает XML экземпляра XmlPullParser?

+0

Вы передаете в XmkPullParser некоторые чтения? Почему бы просто не прочитать все дважды? И: если вы хотите использовать JAXB для создания иерархии POJO: какова цель разбора XML? – laune

+0

Проблема в том, что у меня нет доступа к Reader, который представляет собой необработанный XML-поток. Только XmlPullParser передается из фреймворка (Smack) в мои пользовательские расширения. – MrD

ответ

0

Поскольку, похоже, нет другого способа получить необработанную XML-строку, я решил ее восстановить, используя методы синтаксического анализа XmlPullParser (как описано в вопросе выше).

Только в случае, если кто нуждается в этом: В первом проекте, код выглядит следующим образом

int eventType = parser.getEventType(); 
String extensionElementName = parser.getName(); 
StringBuilder extensionBuilder = new StringBuilder(); 
String element = ""; 

while(!(eventType == XmlPullParser.END_TAG && parser.getName().equalsIgnoreCase(extensionElementName))) { 
    if(eventType == XmlPullParser.END_TAG && parser.getText().equalsIgnoreCase(element)) { 
     // this is for elements which are closed immediately like the following example: <sample /> 
     // otherwise, this line would be added twice 
    } else { 
     extensionBuilder.append(parser.getText()); 
    } 

    element = parser.getText(); 
    eventType = parser.next(); 
} 

// append closing element 
if(!parser.getText().equalsIgnoreCase(element)) 
    extensionBuilder.append(parser.getText()); 
Смежные вопросы