У меня есть требование для динамического создания XML с заданными входными параметрами, такими как XSD файл и строка JSON (при необходимости JSON-сообщение может быть преобразовано в объект HashMap). Java-программа должна ассоциировать имя элемента, присутствующее в объекте JSON string/HashMap, с именем элемента, присутствующим в XSD, и соответствующим образом генерировать XML. Также учтите, что у меня будет несколько XSD, из которых один будет передан в качестве входных данных для программы на основе некоторого состояния.
1) JSON String:
---------------
{
"employeeInput":{
"name":"someone",
"age":"25",
"street":"high street",
"city":"Amsterdam"
}
}
(or I can convert JSON string to HashMap object and send this object as input)
HashMap Object:
---------------
{employeeInput={name=someone, age=25, street=high street, city=Amsterdam}}
2) XSD File:
------------
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.XYZOrganization.com/schemas/Request_Handler/Schema.xsd"
targetNamespace="http://www.XYZOrganization.com/schemas/Request_Handler/Schema.xsd"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element name="employeeInput">
<xs:complexType>
<xs:sequence>
<xs:element ref="name"/>
<xs:element ref="age"/>
<xs:element ref="street"/>
<xs:element ref="city"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:string"/>
<xs:element name="street" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<ns0:employeeInput xmlns:ns0="http://www.XYZOrganization.com/schemas/Request_Handler/Schema.xsd">
<ns0:name>someone</ns0:name>
<ns0:age>25</ns0:age>
<ns0:street>high street</ns0:street>
<ns0:city>Amsterdam</ns0:city>
</ns0:employeeInput>
Пожалуйста, дайте мне знать, есть ли какой-либо вариант для достижения этого. Я читал о сортировке JAXB, но очень мало знаю, как это реализовать.
Благодаря,
Param
Обработка JSON слишком проста...
Итак, сначала пойдите со своим XSD.
Используйте инструмент XJC для создания классов Java (JAXB POJO). Вы можете найти краткое руководство для этого здесь.
xjc schema.xsd
Где схема - ваш xsd.
Затем заполните классы вашим json.
Используйте json-библиотеку для анализа объекта json, например simplejson, org.json или Gson
В моем случае я бы использовал org.json.
Пожалуйста, добавьте библиотеку json в свой путь к классу, затем
JSONObject json = new JSONObject("YourJsonStringGoesHere");
затем установите поля вашего POJO с помощью этого объекта json.
как...
JSONObject MyJson=JSONObject.get("employeeInput"); //gets root object
EmployeeInput obj = new EmployeeInput(); //Instantiate your pojo class
//Let start populating your pojo
obj.setName(MyJson.getString("name"));
obj.setAge(MyJson.getInt("age"));
//after populating your pojo
//marshal the pojo with JAXB to create your xml
try {
JAXBContext context = JAXBContext.newInstance(EmployeeInput.class);
Marshaller m = context.createMarshaller();
//for pretty-print XML in JAXB
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// Write to System.out for debugging
// m.marshal(emp, System.out);
// Write to File
m.marshal(emp, new File(FILE_NAME));
}
catch (JAXBException e)
{
e.printStackTrace();
}
1. Разберите Json String в Map с помощью Gson, скачайте его здесь
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(Your_JSON_STRING_GOES_HERE).getAsJsonObject().get("employeeInput");
Type typeOf = new TypeToken<Map<String, String>>(){}.getType();
Map<String, String> map =gson.fromJson(element, typeOf);
2. для маршалинга вам нужно сделать этот шаг
package-info.java
@XmlSchema(
namespace = "http://www.XYZOrganization.com/schemas/Request_Handler/Schema.xsd",
elementFormDefault = XmlNsForm.QUALIFIED,
xmlns={@XmlNs(prefix="ns0", namespaceURI="http://www.XYZOrganization.com/schemas/Request_Handler/Schema.xsd")}
)
package test;
import javax.xml.bind.annotation.*;
создать класс Pojo.
@XmlRootElement(name="employeeInput")
public class Foo {
private String name;
private String age;
private String street;
private String city;
//setter/getter
}
Заполнять класс модели jaxb с карты
// populate jaxb model class
Foo foo = new Foo();
foo.setAge(map.get("age"));
foo.setCity(map.get("city"));
foo.setName(map.get("name"));
foo.setStreet(map.get("street"));
// finally Marshall it
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(foo, System.out);