【问题标题】:XmlPullParser: get/reconstruct raw XMLXmlPullParser:获取/重建原始 XML
【发布时间】:2014-12-12 12:09:02
【问题描述】:

我必须使用 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 字符串(例如 XmlPullParser 当前指向的位置)?或者有谁知道一些重建 XmlPullParser 实例的 XML 的实用程序?

【问题讨论】:

  • 您正在向 XmkPullParser 传递一些 Reader?为什么不简单地把所有东西都读两遍呢?并且:如果您想使用 JAXB 来创建 POJO 层次结构:拉解析 XML 的目的是什么?
  • 问题是,我无法访问代表原始 XML 流的 Reader。只有 XmlPullParser 从框架 (Smack) 传递到我的自定义扩展。

标签: java xml jaxb xmlpullparser


【解决方案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());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2010-10-06
    • 2017-01-17
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多