使用 JAXB 在其主体中使用 CDATA 解组 SOAP 响应

Unmarshal SOAP response with CDATA in its body using JAXB

我正在尝试使用 JAXB 解组 SOAP 响应但没有成功。到目前为止,我所拥有的是使用 xsd 生成的模型 类 和以下应该解组响应的代码:

SOAPBody soapBody = soapResponse.getSOAPBody();
// Next line should get me to bspQuittung element from response
DOMSource domSource = new DOMSource(soapBody.getFirstChild().getFirstChild());
JAXBContext jaxbContext = JAXBContext.newInstance(BspQuittung.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
BspQuittung bspQuittung = jaxbUnmarshaller.unmarshal(domSource, BspQuittung.class).getValue();

然后我尝试访问 <AnnahmeErfolgreich> 元素的值,而不是像响应中的 true 那样,unmarshaller 给我的对象的值为 false .

我错过了什么?再次调用 getFirstChild() 尝试更深入会导致 Unexpected node type: com.sun.xml.messaging.saaj.soap.impl.SOAPTextImpl 异常。

下面是回复本身:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <ns2:sendBspNachrichtNativeOutput xmlns:ns2="somevalue">
         <bspQuittung><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<BspQuittung version="1.5" fassung="2020-03-15" xmlns="somevalue">
    <AnnahmeErfolgreich>true</AnnahmeErfolgreich>
    <ErgebnisStatus>
        <Tabelle>someInt</Tabelle>
        <Schluessel>someInt</Schluessel>
    </ErgebnisStatus>
</BspQuittung>]]></bspQuittung>
      </ns2:sendBspNachrichtNativeOutput>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

如何更改代码以使解组器按预期工作?谢谢!

我不得不使用 XMLStreamReader 作为回答 here 但我还使用了 InputStream:

而不是文件
     SOAPBody soapBody = soapResponse.getSOAPBody();
     XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
     Node soapBodyChild = soapBody.getFirstChild();
     String bspQuittungAsXmlString = soapBodyChild.getFirstChild().getFirstChild().getNodeValue();
     byte[] bspQuittungAsByteArray = bspQuittungAsXmlString.getBytes(StandardCharsets.UTF_8);
     ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bspQuittungAsByteArray);
     InputStreamReader inputStreamReader = new InputStreamReader(byteArrayInputStream);
     XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(inputStreamReader);
     JAXBContext jaxbContext = JAXBContext.newInstance(BspQuittung.class);
     Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
     BspQuittung bspQuittung = jaxbUnmarshaller.unmarshal(xmlStreamReader, BspQuittung.class).getValue();
     xmlStreamReader.close();
     inputStreamReader.close();
     byteArrayInputStream.close();

在此之后,变量 bspQuittung 具有正确的值。