无法获取编码的XML字符串的值

时间:2018-10-04 11:05:42

标签: java xml xml-parsing

我从端点返回了一个长的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,父级为{{ 1}}

我做了以下工作,但是我无法检索ItemFile节点。我希望从此xml中检索的主要值是Order属性Item,如果无法获取File节点,则无法获取Order No属性。

先谢谢了。

No

2 个答案:

答案 0 :(得分:2)

我有两种方法来解决您的问题

您可以使用任意方式

方法1:

Java正确解析XML

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

这样,您可以对xml进行转义

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”]

因为您使用过正则表达式 您可以使用字符串替换删除不需要的括号 或者您也可以使用高效的正则表达式

希望这对您有帮助!!!!

快乐编码

答案 1 :(得分:0)

首先尝试从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();