XML-дизайн документа

У меня есть группа рабочего кода для создания XML-запроса в определенном формате, как показано ниже. Но логика была просто захардкоженным примером emaillist.appendChilddocument.createElement и так далее. Есть ли лучший способ добиться того же результата? Может быть, используя какой-нибудь заглушку или пользовательский объект Java типа XML?

public void setXML() throws JAXBException, ParserConfigurationException {

 DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
 DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
 Document document = docBuilder.newDocument();
 Element emaillist = document.createElement("EMAILLIST");

 Element templateID = document.createElement("TemplateID");
 templateID.setTextContent("1");

 Element campaignID = document.createElement("CampaignID");
 campaignID.setTextContent("100");

 Element campaignName = document.createElement("CampaignName");
 campaignName.setTextContent("Test Campaign Using XML DS");

 Element category = document.createElement("Category");
 category.setTextContent("Trigger");

 Element email = document.createElement("Email");
 email.setTextContent("[email protected]");

 Element subject = document.createElement("Subject");
 subject.setTextContent("Transactional Submissions");

 Element senderEmail = document.createElement("SenderEmail");
 senderEmail.setTextContent("support@test");

 Element emailBody = document.createElement("EmailBody");
 Element html = document.createElement("html");
 Element head = document.createElement("head");
 Element title = document.createElement("title");
 title.setTextContent("This is test Title : " + ZonedDateTime.now());
 head.appendChild(title);
 Element body = document.createElement("body");
 html.appendChild(head);
 html.appendChild(body);
 emailBody.appendChild(html);

 emaillist.appendChild(templateID);
 emaillist.appendChild(campaignID);
 emaillist.appendChild(campaignName);
 emaillist.appendChild(category);
 emaillist.appendChild(email);
 emaillist.appendChild(subject);
 emaillist.appendChild(senderEmail);
 emaillist.appendChild(emailBody);
 System.out.println(emaillist);

}

Образец требуемого вывода

<EMAILLIST
    xmlns:ns2 = "TransactionalSubmissionsSvcs"
    xmlns = "">
    <TemplateID>1</TemplateID>
    <CampaignID>100</CampaignID>
    <CampaignName>Test Campaign Using XML DS</CampaignName>
    <Category>Trigger</Category>
    <Email>[email protected]</Email>
    <Subject>Transactional Submissions</Subject>
    <SenderEmail>[email protected]</SenderEmail>
    <EmailBody>
        <html>
            <head>
                <title>This is test Title : 2019-03-17T20:32:43.649+08:00</title>
            </head>
            <body/>
        </html>
    </EmailBody>
</EMAILLIST>

См. stackoverflow.com/questions/23520208/…

Progman 17.03.2019 17:46

Предлагаемый пост соответствует тому, что я сделал. Но я пытаюсь найти лучший способ добиться этого, потому что считаю, что мое решение сейчас плохое.

XuSen 17.03.2019 19:36

Как упоминалось в других вопросах, вы можете использовать JAXB, который автоматически заполнит ваши объекты значениями.

Progman 17.03.2019 19:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Создайте модель POJO, которая представляет вашу XML, и после этого сериализуйте ее в XML, используя JAXB, Jackson XML или другую библиотеку. Пример с POJO моделью и JAXB:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.time.ZonedDateTime;

public class JaxbApp {

    public static void main(String[] args) throws Exception {
        JAXBContext jaxbContext = JAXBContext.newInstance(EmailList.class);
        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

        EmailBody emailBody = new EmailBody();
        emailBody.setTitle("This is test Title : " + ZonedDateTime.now());
        emailBody.setBody("");

        EmailList emailList = new EmailList();
        emailList.setTemplateId(1);
        emailList.setCampaignId(100);
        emailList.setCampaignName("Test Campaign Using XML DS");
        emailList.setCategory("Trigger");
        emailList.setEmail("[email protected]");
        emailList.setSubject("Transactional Submissions");
        emailList.setSenderEmail("[email protected]");
        emailList.setEmailBody(emailBody);

        marshaller.marshal(emailList, System.out);
    }
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "EMAILLIST", namespace = "TransactionalSubmissionsSvcs")
class EmailList {

    @XmlElement(name = "TemplateID")
    private int templateId;

    @XmlElement(name = "CampaignID")
    private int campaignId;

    @XmlElement(name = "CampaignName")
    private String campaignName;

    @XmlElement(name = "Category")
    private String category;

    @XmlElement(name = "Email")
    private String email;

    @XmlElement(name = "Subject")
    private String subject;

    @XmlElement(name = "SenderEmail")
    private String senderEmail;

    @XmlElement(name = "EmailBody")
    private EmailBody emailBody;

    // getters, setters
}

class EmailBody {

    private String title;
    private String body;

    // getters, setters
}

Над кодом печатается:

<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
<ns2:EMAILLIST xmlns:ns2 = "TransactionalSubmissionsSvcs">
    <TemplateID>1</TemplateID>
    <CampaignID>100</CampaignID>
    <CampaignName>Test Campaign Using XML DS</CampaignName>
    <Category>Trigger</Category>
    <Email>[email protected]</Email>
    <Subject>Transactional Submissions</Subject>
    <SenderEmail>[email protected]</SenderEmail>
    <EmailBody>
        <body></body>
        <title>This is test Title : 2019-03-18T00:03:48.168+01:00</title>
    </EmailBody>
</ns2:EMAILLIST>

Если вам действительно нужны элементы html и head, вам нужно создать простые POJO обертки.

Другие вопросы по теме