JAXB,如何在出错的情况下解组不同的对象

时间:2017-03-14 08:56:52

标签: java xml parsing stream jaxb

JAXB是否提供了一些API来根据根元素将XML流解组为备用对象?

生成流的应用程序可以返回

<Result>
 <data>...</data>
</Result>

<Error>
  <cause>...</cause>
</Error>

取决于执行状态。在这两种情况下,输出都是从stdin读取的,我需要根据输出解组Result对象或Error对象。这是否可以使用JAXB,而不是将输出存储在临时String中并手动检查内容,并决定要解析哪个对象?

2 个答案:

答案 0 :(得分:3)

只需使用多个类并相应地添加带有名称的@XmlRootElement注释,然后通过指定两个类来创建JAXBContext

@XmlRootElement(name = "Result")
@XmlAccessorType(XmlAccessType.FIELD)
static class Result {
    String data;
}

@XmlRootElement(name = "Error")
@XmlAccessorType(XmlAccessType.FIELD)
static class Error {
    String cause;
}

public static void main(String[] args) throws JAXBException {
    JAXBContext jaxbContext = JAXBContext.newInstance(Result.class, Error.class);
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
    String sampleErrorInput = "<Error><cause>Sample cause</cause></Error>";
    String sampleResultInput = "<Result><data>Sample data</data></Result>";
    for (String input : Arrays.asList(sampleErrorInput, sampleResultInput)) {
        Object obj = unmarshaller.unmarshal(new StringReader(input));
        if (obj instanceof Error) {
            System.out.println("Error: " + ((Error) obj).cause);
        } else if (obj instanceof Result) {
            System.out.println("Result: " + ((Result) obj).data);
        }
    }
}

上面的代码产生了这个输出:

Error: Sample cause
Result: Sample data

答案 1 :(得分:0)

JAXB是一个软件框架,允许Java开发人员将Java类映射到XML表示,就是这样。您应该注意根据执行结果返回正确的xml结构,并且可以返回Result元素或Error元素或其他任何内容。