将Soap XML响应转换为对象

我是使用SOAP API的新手

我有一个来自API的肥皂响应

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

<soapenv:Body>

<LoginResponse xmlns="http://test.org/ADMail_Service">

<LoginResult>

<ErrorMessage>Successful login</ErrorMessage>

<Status>true</Status>

</LoginResult>

</LoginResponse>

</soapenv:Body>

</soapenv:Envelope>

我正在尝试将其转换为对象。

通过在线阅读文章,我试图使用JAXB来做到这一点,但是我的对象是空的。

这是读取响应的代码。我将响应写到xml文件中以进行测试:

try {

XMLInputFactory xif = XMLInputFactory.newFactory();

XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("input.xml"));

xsr.nextTag(); // Advance to Envelope tag

xsr.nextTag(); // Advance to Body tag

xsr.nextTag();

xsr.nextTag();

JAXBContext jc = JAXBContext.newInstance(LoginResult.class);

Unmarshaller unmarshaller = jc.createUnmarshaller();

JAXBElement<LoginResult> je = unmarshaller.unmarshal(xsr, LoginResult.class);

System.out.println(je.getName());

System.out.println(je.getValue());

} catch (XMLStreamException e) {

e.printStackTrace();

} catch (JAXBException e) {

e.printStackTrace();

} catch (FileNotFoundException e) {

e.printStackTrace();

}

LoginResult类:

public class LoginResult {

private String errorMessage;

private String status;

public String getErrorMessage() {

return errorMessage;

}

public void setErrorMessage(String errorMessage) {

this.errorMessage = errorMessage;

}

public String getStatus() {

return status;

}

public void setStatus(String status) {

this.status = status;

}

}

提前致谢!

回答:

您可以使用此代码检索POJO,还可以将@XmlRootElement作为标头添加到POJO。

(我没有测试下面的代码)

XMLInputFactory xif = XMLInputFactory.newFactory();

XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("input.xml"));

xsr.nextTag(); // Advance to Envelope tag

xsr.nextTag(); // Advance to Body tag

xsr.nextTag();

xsr.nextTag();

Transformer transformer = TransformerFactory.newInstance().newTransformer();

StringWriter stringWriter = new StringWriter();

transformer.transform(new StAXSource(xsr), new StreamResult(stringWriter));

StringReader sr = new StringReader(stringWriter.toString());

JAXBContext jaxbContext = JAXBContext.newInstance(LoginResult.class);

Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

LoginResult loginResult = (LoginResult) unmarshaller.unmarshal(sr);

我为您找到了解决方案:

    @XmlRootElement(name = "LoginResult", namespace = "http://test.org/ADMail_Service")

@XmlAccessorType(XmlAccessType.FIELD)

public class LoginResult {

@XmlElement(name = "ErrorMessage", namespace = "http://test.org/ADMail_Service")

private String errorMessage;

@XmlElement(name = "Status", namespace = "http://test.org/ADMail_Service")

private String status;

public String getErrorMessage() {

return errorMessage;

}

public void setErrorMessage(String errorMessage) {

this.errorMessage = errorMessage;

}

public String getStatus() {

return status;

}

public void setStatus(String status) {

this.status = status;

}

}

public static void main(String[] args) {

try {

XMLInputFactory xif = XMLInputFactory.newFactory();

XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("input.xml"));

xsr.nextTag(); // Advance to Envelope tag

xsr.nextTag(); // Advance to Body tag

xsr.nextTag();

xsr.nextTag();

JAXBContext jc = JAXBContext.newInstance(LoginResult.class);

Unmarshaller unmarshaller = jc.createUnmarshaller();

JAXBElement<LoginResult> je = unmarshaller.unmarshal(xsr, LoginResult.class);

System.out.println(je.getName());

System.out.println(je.getValue());

System.out.println(je.getValue().getErrorMessage());

} catch (XMLStreamException e) {

e.printStackTrace();

} catch (JAXBException e) {

e.printStackTrace();

} catch (FileNotFoundException e) {

e.printStackTrace();

}

}

以上是 将Soap XML响应转换为对象 的全部内容, 来源链接: utcz.com/qa/429133.html

回到顶部