Преобразуйте строку SOAP XML в объект или просто прочтите ее содержимое

Я получаю ответ SOAP XML от конечной точки и пытаюсь прочитать его содержимое. Я пробовал несколько методов, но он продолжает давать мне ноль

String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><soap:Body><CashOutPaymentRequestResponse xmlns=\"http://tempuri.org/\"><CashOutPaymentRequestResult><ResponseCode>1002</ResponseCode><ResponseDesc>FAC Code and Amount does not match, Contact your Admin.</ResponseDesc></CashOutPaymentRequestResult></CashOutPaymentRequestResponse></soap:Body></soap:Envelope>";

JAXBContext jaxbContext = JAXBContext.newInstance(cashOutPaymentRequestEnvelope.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

StringReader reader = new StringReader(xml);
cashOutPaymentRequestEnvelope person = (cashOutPaymentRequestEnvelope) unmarshaller.unmarshal(reader);

Мой способ 2

Element rootdecryptedXml = XmlParseHelper.getStringXml(xml);
String responseUnEscapedXml = StringEscapeUtils.unescapeXml(XmlParseHelper.getString("CashOutPaymentRequestResult", rootdecryptedXml));

String responseEscapedXml = XmlParseHelper.getString("CashOutPaymentRequestResult", rootdecryptedXml);

   System.out.println("step 1.. \n" + responseEscapedXml);

   Element root = XmlParseHelper.getStringXml(responseEscapedXml);

   System.out.println("step 2aa...\n" + XmlParseHelper.getString("ResponseCode", root));
   System.out.println("step 2bb...\n" + XmlParseHelper.getString("ResponseDesc", root));

Ни один из методов, похоже, не работает, все они дают мне ноль

Моя функция getString

public static String getString(String tagName, Element element) {
    if (element == null) {
        return " ";
    }

    NodeList list = element.getElementsByTagName(tagName);

    if (list != null && list.getLength() > 0) {
        NodeList subList = list.item(0).getChildNodes();
        if (subList != null && subList.getLength() > 0) {
            return subList.item(0).getNodeValue();
        }
    }
    return " ";
}

Я получаю StringXml

public static Element getStringXml(String responseXml) throws SAXException, IOException, ParserConfigurationException {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    Document document;
    Element rootdecryptedXml = null;
    DocumentBuilder builder;
    builder = factory.newDocumentBuilder();
    document = builder.parse(new InputSource(new StringReader(responseXml)));
    rootdecryptedXml = document.getDocumentElement();
    return rootdecryptedXml;
}

Ваш первый метод, использующий JAXB, является звуковым - при условии, что класс JAXB Java является правильным для данного XML. Вам просто нужно передать JAXB Unmarshaller только соответствующий XML (часть <CashOutPaymentRequestResult> ... </ CashOutPaymentRequestResul t>) без конверта SOAP. Используйте API SAAJ, чтобы получить это, а затем демаршалировать его. См. docs.oracle.com/cd/E19644-01/817-5452/wsgjaxm.html для SAAJ.

Michal 15.11.2018 17:04

Спасибо, @Michal смог заставить его работать. Опубликует реализацию

DaviesTobi alex 15.11.2018 17:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
1 224
1

Ответы 1

Благодаря комментарию Михала я разработал решение этого

InputStream is = new ByteArrayInputStream(xml.getBytes());
        MessageFactory factory = MessageFactory.newInstance();
        SOAPMessage message = factory.createMessage(null, is);
        NodeList listResult = message.getSOAPBody().getElementsByTagName("CashOutPaymentRequestResult");
        for (int i = 0; i < listResult.getLength(); i++) {
            NodeList children = listResult.item(i).getChildNodes();
            for (int k = 0; k < children.getLength(); k++) {
                System.out.println(children.item(k).getNodeName());
                System.out.println(children.item(k).getTextContent());
                if (children.item(k).getNodeName().equals("ResponseCode")) {

                }

                if (children.item(k).getNodeName().equals("ResponseDesc")) {

                }
            }
        }

Другие вопросы по теме