XmlPullParser:获取/重构原始XML

时间:2014-12-12 12:09:03

标签: java xml jaxb xmlpullparser

我被绑定使用XmlPullParser(因为我们使用Smack XMPP库)。 但是用它解析XML并将读取值放入bean中是非常不方便的(至少如果给出了XSD)。相比之下,JAXB将更容易使用。

同样对于序列化来说,手动连接字符串是一种“老式且容易出错的方法”。 (参见http://babbler-xmpp.blogspot.co.at/2014_01_01_archive.html的动机,其中也总结了缺点)。

但是要使用JAXB进行反序列化,我必须得到原始的XML-String。 当然,一种方法是使用XmlPullParser的解析方法(如getName()getText()getAttributes(),...)重建整个XML-String。但我想避免这种情况。

那么是否可以获取特定标记的整个原始XML-String(例如XmlPullParser当前指向的位置)?或者有没有人知道一些重构XmlPullParser实例的XML的实用程序?

1 个答案:

答案 0 :(得分: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());