XmlPullParser: получить / восстановить необработанный XML

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

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

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

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


person MrD    schedule 12.12.2014    source источник
comment
Вы передаете XmkPullParser какой-нибудь Reader? Почему бы просто не прочитать все дважды? И: если вы хотите использовать JAXB для создания иерархии POJO: какова цель анализа XML по запросу?   -  person laune    schedule 13.12.2014
comment
Проблема в том, что у меня нет доступа к Reader, представляющему необработанный XML-поток. Из фреймворка (Smack) в мои пользовательские расширения передается только XmlPullParser.   -  person MrD    schedule 15.12.2014


Ответы (1)


Поскольку кажется, что другого способа получить необработанную 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());
person MrD    schedule 13.01.2015