Не удается получить значение кодированной строки XML - PullRequest
0 голосов
/ 04 октября 2018

У меня есть длинная строка XML, возвращенная из конечной точки.

String responseXml = " <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header>
        <ActivityId xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics" CorrelationId="b0cfeb30-eb31-4ff8-91d6-c9f34d69497b">b177c70e-4ab6-448b-a0e6-42478e796167</ActivityId>
    </s:Header>
    <s:Body>
        <IssueDomesticOrderResponse xmlns="http://tempuri.org/">
            <IssueDomesticOrderResult>&lt;Envelope XMLVersion="02" Direction="Result"&gt;&#xD; &lt;Task Code="IssueDomesticOrder"&gt;&#xD; &lt;Success&gt;true&lt;/Success&gt;&#xD; &lt;DateTime&gt;2018-10-05T07:24:27.035983Z&lt;/DateTime&gt;&#xD; &lt;Item&gt;&#xD; &lt;File&gt;&amp;lt;Orders Version="4.00"&amp;gt;&amp;lt;Order No="0NGAOR18100000000603" ProductCd="OR"
                ServiceAgreementCd="0"&amp;gt;&amp;lt;Event StateCd="CC" LCLDT="2018-10-05T08:24:27.4891095+01:00" OfficeCd="LOS001" EventOriginCd="S"&amp;gt;&amp;lt;PurchaseInformation Value="30" CurrencyCd="NGN" ValidUntil="2018-10-05" FeeValue="100.000" FeeCurrencyCd="NGN" PayOfficeCode="LOS001" PayOfficeName="---TEST OFFICE----" PurchaseOfficeCode="LOS001" PurchaseOfficeName="---TEST
                OFFICE----"&amp;gt;&amp;lt;Sender CustomerID="4224" Title="MR" Last="Choji" First="Shikamaru" PostCode="LOS001" City="Lausanne" CountryCd="NG" Mobile="08124533711" /&amp;gt;&amp;lt;Recipient CustomerID="4225" Title="MS" Last="Jira" First="Amy" PostCode="1200" City="Geneve" CountryCd="NG" Mobile="08124577322"
                /&amp;gt;&amp;lt;/PurchaseInformation&amp;gt;&amp;lt;/Event&amp;gt;&amp;lt;/Order&amp;gt;&amp;lt;/Orders&amp;gt;&lt;/File&gt;&#xD; &lt;Result&gt;&#xD; &lt;Code&gt;Success&lt;/Code&gt;&#xD; &lt;Description /&gt;&#xD; &lt;/Result&gt;&#xD; &lt;/Item&gt;&#xD; &lt;/Task&gt;&#xD;&lt;/Envelope&gt;</IssueDomesticOrderResult>
        </IssueDomesticOrderResponse>
    </s:Body>
</s:Envelope>";

Я попытался проанализировать строку xml и получить атрибут Order No, который у нее есть, который является дочерним элементом Orders, чей родитель File, а родитель Item

Я сделал следующее ниже, но я не могу получить узел File или Item.Основное значение, которое я хочу извлечь из этого xml, - это атрибут Order No, и, если я не могу получить узел File, нет способа получить атрибут Order No.

Заранее спасибо.

        Element rootdecryptedXml = getStringXml(responseXml);
        String responseUnEscapedXml = StringEscapeUtils.unescapeXml(getString("IssueDomesticOrderResult", rootdecryptedXml));
        String responseEscapedXml = getString("IssueDomesticOrderResult", rootdecryptedXml);

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

        Element root = getStringXml(responseUnEscapedXml);

        System.out.println("step 2a...\n" + responseXml);
        System.out.println("step 2aa...\n" + getString("Success", root));

        if (getString("Success", root).equals("true")) {
            System.out.println("inside true");
            String FileEscapedXml = getString("File", root);
            String FileUnEscapedXml = StringEscapeUtils.unescapeXml(getString("File", root));

            System.out.println("step 3a...\n" + FileEscapedXml);
            System.out.println("step 3aa...\n" + FileUnEscapedXml);
}

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

У меня есть два подхода для решения вашей проблемы

, вы можете использовать любой способ, какой захотите

Метод 1:

Правильный синтаксический анализ Java xmls

Hear - это пример кода, где вы можете получить номер заказа из вашего xml

            String filepath = "/home/sample.xml"; //this file contains unecaped xml 
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
            Document xmlDoc = docBuilder.parse(filepath);
            Node Order = xmlDoc.getElementsByTagName("Order").item(0);
            NamedNodeMap attr = Order.getAttributes();
            Node no = attr.getNamedItem("No");
            System.out.println("Order no : " + no.getNodeValue());

Вывод этого кода

Номер заказа: 0NGAOR18100000000603

Таким образом, вы можете unescape xmls

String unescapedStr=StringEscapeUtils.unescapeXml(StringEscapeUtils.unescapeXml(str)));//you can store it in a file if you want

Я сделал unescapeXml twise

Метод 2:

Если вы нехотите отформатировать xml и хотите, чтобы в нем не было заказа. Существует простой способ добиться этого с помощью Regex

private static final Pattern TAG_REGEX = Pattern.compile("Order No(.+?) ");

    private static List<String> getOrderNo(final String str) {
        final List<String> tagValues = new ArrayList<String>();
        final Matcher matcher = TAG_REGEX.matcher(str);
        while (matcher.find()) {
            tagValues.add(matcher.group(1));
        }
        return tagValues;
    }

. Вызовите метод следующим образом

System.out.println(Arrays.toString(getOrderNo(str).toArray()));

Вывод будет

[= "0NGAOR18100000000603"]

, так как вы использовали регулярное выражение, вы можете удалить ненужные скобки, используя замену строки, или вы можете использовать все еще эффективные регулярные выражения

Надеюсь, это поможетвы !!!!

Счастливое кодирование

0 голосов
/ 04 октября 2018

Попробуйте сначала извлечь тело сообщения из сообщения SOAP.Затем запустите ваш код, чтобы удалить его и обработать его содержимое.

// create message factory
MessageFactory mf = MessageFactory.newInstance();
// headers for a SOAP message
MimeHeaders header = new MimeHeaders();     
header.addHeader("Content-Type", "text/xml");
InputStream stream = new ByteArrayInputStream(responseXml .getBytes(StandardCharsets.UTF_8));
// create the SOAPMessage
SOAPMessage soapMessage = mf.createMessage(header,stream);
// get the body
SOAPBody soapBody = soapMessage.getSOAPBody();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...