我从端点返回了一个长的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><Envelope XMLVersion="02" Direction="Result">
 <Task Code="IssueDomesticOrder">
 <Success>true</Success>
 <DateTime>2018-10-05T07:24:27.035983Z</DateTime>
 <Item>
 <File>&lt;Orders Version="4.00"&gt;&lt;Order No="0NGAOR18100000000603" ProductCd="OR"
ServiceAgreementCd="0"&gt;&lt;Event StateCd="CC" LCLDT="2018-10-05T08:24:27.4891095+01:00" OfficeCd="LOS001" EventOriginCd="S"&gt;&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----"&gt;&lt;Sender CustomerID="4224" Title="MR" Last="Choji" First="Shikamaru" PostCode="LOS001" City="Lausanne" CountryCd="NG" Mobile="08124533711" /&gt;&lt;Recipient CustomerID="4225" Title="MS" Last="Jira" First="Amy" PostCode="1200" City="Geneve" CountryCd="NG" Mobile="08124577322"
/&gt;&lt;/PurchaseInformation&gt;&lt;/Event&gt;&lt;/Order&gt;&lt;/Orders&gt;</File>
 <Result>
 <Code>Success</Code>
 <Description />
 </Result>
 </Item>
 </Task>
</Envelope></IssueDomesticOrderResult>
</IssueDomesticOrderResponse>
</s:Body>
</s:Envelope>";
我尝试解析xml字符串并检索其具有的Order
No
属性,该属性是Orders
的子项,其父级为File
,父级为{{ 1}}
我做了以下工作,但是我无法检索Item
或File
节点。我希望从此xml中检索的主要值是Order属性Item
,如果无法获取File节点,则无法获取Order No属性。
先谢谢了。
No
答案 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();