需要Java中的解析器从XML(SOAP)到JSON

问题描述 投票:0回答:3

我正在寻找 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 json xml magento soap
3个回答
0
投票

如果您使用的是 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"
}

0
投票
   
    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)

0
投票

你可以使用这个库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());
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.