我正在寻找 Java 中的解析器或 SOAP 客户端,以将 XML(WSDL) 从 Magento SOAP v1 API 转换为 JSON 对象。
Magento SOAP v1 API 返回一个 XML,如下所示:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:Magento"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:callResponse>
<callReturn xsi:type="ns2:Map">
<item>
<key xsi:type="xsd:string">store_id</key>
<value xsi:type="xsd:string">1</value>
</item>
<item>
<key xsi:type="xsd:string">created_at</key>
<value xsi:type="xsd:string">2013-03-05 05:56:35</value>
</item>
<item>
<key xsi:type="xsd:string">updated_at</key>
<value xsi:type="xsd:string">2017-11-09 15:37:05</value>
</item>
<item>
<key xsi:type="xsd:string">shipping_address</key>
<value xsi:type="ns2:Map">
<item>
<key xsi:type="xsd:string">address_id</key>
<value xsi:type="xsd:string">1</value>
</item>
<item>
<key xsi:type="xsd:string">created_at</key>
<value xsi:type="xsd:string">2013-01-31 11:37:38</value>
</item>
<item>
<key xsi:type="xsd:string">updated_at</key>
<value xsi:type="xsd:string">2017-11-09 15:37:05</value>
</item>
</value>
</item>
</callReturn>
</ns1:callResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我想收到一个像这样的简单 JSON 对象:
{
"store_id": "1",
"created_at": "2013-03-05 05:56:35",
"updated_at": "2017-11-09 15:37:05",
"shipping_address": {
"address_id": "1",
"created_at": "2013-01-31 11:37:38",
"updated_at": "2017-11-09 15:37:05"
}
}
如果您使用的是 Java 8 或更高版本,您应该查看我的开源库:unXml。 unXml 基本上从 Xpath 映射到 Json 属性。
它可以在 Maven Central 上找到。
示例
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.nerdforge.unxml.factory.ParsingFactory;
import com.nerdforge.unxml.parsers.Parser;
import org.w3c.dom.Document;
public class Parser {
public ObjectNode parseXml(String xml){
Parsing parsing = ParsingFactory.getInstance().create();
Document document = parsing.xml().document(xml);
Parser<ObjectNode> parser = parsing.obj()
.attribute("store_id", "//item[key/text() = 'store_id']/value")
.attribute("created_at", "//item[key/text() = 'created_at']/value")
.attribute("updated_at", "//item[key/text() = 'updated_at']/value")
.attribute("shipping_address", parsing.obj("//item[key/text() = 'shipping_address']")
.attribute("address_id", "value/item[key/text() = 'address_id']/value")
.attribute("created_at", "value/item[key/text() = 'created_at']/value")
.attribute("updated_at", "value/item[key/text() = 'updated_at']/value")
)
.build();
ObjectNode result = parser.apply(document);
return result;
}
}
它将返回一个 Jackson
ObjectNode
,带有以下 json:
{
"created_at": "2013-03-05 05:56:35",
"shipping_address": {
"created_at": "2013-01-31 11:37:38",
"address_id": "1",
"updated_at": "2017-11-09 15:37:05"
},
"store_id": "1",
"updated_at": "2017-11-09 15:37:05"
}
public static JSONObject readToJSONObject(String xmlBody) {
SAXReader saxReader = new SAXReader();
try {
Document document = saxReader.read(new ByteArrayInputStream(xmlBody.getBytes()));
Element rootElement = document.getRootElement();
JSONObject jsonObject = new JSONObject();
doParse(jsonObject, rootElement);
return jsonObject;
} catch (DocumentException e) {
e.printStackTrace();
return null;
}
}
public static void doParse(JSONObject jsonObject, Element element) {
String elementName = element.getName();
List<Element> elements = element.elements();
if (CollectionUtils.isEmpty(elements)) {
jsonObject.put(elementName, element.getText());
} else {
JSONObject itemJsonObject = new JSONObject();
for (Element itemElement : elements) {
doParse(itemJsonObject, itemElement);
}
jsonObject.put(elementNmae, itemJsonObject);
}
}
使用
readToJSONObject(xmlBody)
你可以使用这个库https://github.com/stleary/JSON-java/blob/master/src/main/java/org/json/XML.java
然后解析部分 SOAP Response 来获取 json 数据:
import org.json.JSONObject;
import org.json.XML;
public class Main {
public static void main(String[] args) {
try {
JSONObject jsonObj = XML.toJSONObject(XML_STRING);
} catch (JSONException e) {
System.out.println(e.toString());
}
}
}