Как создать XML в Java, используя XSD и JSON или HashMap элементов / значений в качестве входных данных

1

У меня есть требование для динамического создания 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 (с пространством имен и префиксом в соответствии с XSD):

    <?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

Теги:
jaxb
xsd

2 ответа

0

Обработка 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();
     }
0

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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню