需引入 Axis 相關 JAR(axis.jar、jaxrpc.jar、saaj.jar、wsdl4j.jar、commons-logging.jar、commons-discovery.jar)。
public class AxisXmlClient {
/** 發送報文並獲取回應 */
public String sendRequest(String requestXml, String endpoint, String namespace, String methodName)
throws Exception {
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(endpoint);
call.setOperationName(new QName(namespace, methodName));
call.addParameter("parameters",
new QName(namespace, methodName),
ParameterMode.IN);
call.setReturnType(XMLType.XSD_STRING);
String response = (String) call.invoke(new Object[]{requestXml});
return response;
}
/** 解析回應 XML 為 Map */
@SuppressWarnings("unchecked")
public Map parseResponse(String xml) throws Exception {
Map result = new HashMap<>();
Document doc = parseXmlString(xml);
Element root = doc.getDocumentElement();
// 解析 body 部分(含 CDATA)
Node bodyNode = root.getElementsByTagName("body").item(0);
if (bodyNode != null) {
String bodyXml = bodyNode.getTextContent(); // 取出 CDATA 內容
Document bodyDoc = parseXmlString(bodyXml);
extractBusinessData(bodyDoc, result);
}
// 解析 head 返回碼
parseHead(root, result);
return result;
}
private Document parseXmlString(String xml) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
return builder.parse(new ByteArrayInputStream(xml.getBytes("UTF-8")));
}
private void extractBusinessData(Document doc, Map map) {
Element root = doc.getDocumentElement();
NodeList children = root.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
Node node = children.item(i);
if (node instanceof Element) {
traverseNode((Element) node, map);
}
}
}
private void traverseNode(Element element, Map map) {
String name = element.getNodeName();
if (element.getChildNodes().getLength() == 1
&& element.getFirstChild().getNodeType() == Node.TEXT_NODE) {
map.put(name, element.getTextContent().trim());
}
NodeList list = element.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
if (list.item(i) instanceof Element) {
traverseNode((Element) list.item(i), map);
}
}
}
private void parseHead(Element root, Map map) {
Node headNode = root.getElementsByTagName("head").item(0);
if (headNode == null) return;
NodeList list = headNode.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node n = list.item(i);
if ("rtn_msg".equals(n.getNodeName())) {
NodeList msgList = n.getChildNodes();
for (int j = 0; j < msgList.getLength(); j++) {
Node m = msgList.item(j);
if (m instanceof Element) {
map.put(m.getNodeName(), m.getTextContent().trim());
}
}
}
}
}
}
public static void main(String[] args) throws Exception {
String requestXml = ""
+ ""
+ " ..."
+ " "
+ " ";
AxisXmlClient client = new AxisXmlClient();
String response = client.sendRequest(
requestXml,
"https://target-host:port/services/TargetService",
"https://target-namespace",
"doService"
);
Map data = client.parseResponse(response);
System.out.println("解析結果:" + data);
}
getTextContent() 取出再二次解析setNamespaceAware(true) 正確處理 xmlns新專案建議使用 CXF、Spring WebServiceTemplate 或 HttpClient + DOM/SAX,Axis 1.x 已停止維護。