简单XML - 两个不同的根元素

3
我的问题是我需要解析一个可能有两个不同根XML标签的XML文档。
变体1:
<?xml version="1.0" encoding="UTF-8"?>
<success>
success...
</success>

变体2:

<?xml version="1.0" encoding="UTF-8"?>
<error>
error...
</error>

我知道有注释@ElementUnion(),但据我所知它只适用于非根标签。

更多信息:

我正在使用Retrofit消费一个API,并使用Simple-xml解析XML文档。

如果有人有解决方案或解决方法,那将会很棒。

我唯一想到的办法是调用API,捕获异常并使用第二个变量模型进行重试。

提前致谢


请编辑您的帖子以显示Java代码。 - Jim Garrison
@JimGarrison 我只想知道是否可以使用simple-xml-framework(http://simple.sourceforge.net/home.php)解析具有两个可能根元素的xml文档。我不需要实际的实现。 - lampenlampen
从文档上看,似乎你需要在尝试反序列化之前以某种方式检测预期的类。这就是为什么它被称为“简单”。 - Jim Garrison
2
据我所知,当您拥有不同的根元素时,您实际上拥有不同的XML文档类型。解决此问题的一种方法是创建两个解析器,一个用于成功文档,另一个用于错误文档。更好的解决方案是将成功和错误元素都包装在一个共同的根元素中,但这只是一个选项,如果您首先可以控制创建XML文档的话。 - Michael Peacock
@JimGarrison 很不幸,我预料到会得到这个答案。 但很遗憾我无法控制服务器。 或许有些变通的方法吗?因为目前我找到的唯一解决办法是使用变体1 / 2的模型分别调用API两次,并等待哪一个会抛出异常。 不是非常优雅的解决方案。 - lampenlampen
2
我相信@MaanooAk的答案会是你能得到的最好的。 - Jim Garrison
1个回答

3
你可以使用 Persister.validate。它接受与 Persister.read 相同的参数,并在传递的类可以解析时返回简单的true或false。
这是使用API的最佳方法,你也可以通过阅读xml的前两行来手动检测类(在你的示例中),但在更复杂的结构中,你需要使用“validate”。

唯一的问题是:我正在使用Retrofit,没有直接访问或控制反序列化过程。回调给我的方法中,我可以将响应作为字符串获取并验证XML(...),但该方法不会被调用,因为在此之前就抛出了异常。也许我可以通过提供自己的“转换器”来解决这个问题。 - lampenlampen
好的,我找到了一个解决方案。如果我不传递Converter并将返回类型更改为RequestBody,我可以使用您的解决方案提取主体并自己解析它。 - lampenlampen
转换器也很简单,这个简单的转换器只有大约40行代码:https://github.com/square/retrofit/blob/master/retrofit-converters/simplexml/src/main/java/retrofit2/converter/simplexml/SimpleXmlResponseBodyConverter.java - MaanooAk
哦,那我觉得我会重新审视这种方法。 - lampenlampen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接