java - XML 文档设计
问题描述
我有一组工作代码来构造一个特定格式的 XML 请求,如下所示。但是逻辑只是硬编码示例emaillist.appendChild
document.createElement
等等。有没有更好的方法来达到同样的结果?也许使用一些存根或自定义 XML 类型的 Java 实体?
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("test@test.com");
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>test@test.com.my</Email>
<Subject>Transactional Submissions</Subject>
<SenderEmail>test@test.com.my</SenderEmail>
<EmailBody>
<html>
<head>
<title>This is test Title : 2019-03-17T20:32:43.649+08:00</title>
</head>
<body/>
</html>
</EmailBody>
</EMAILLIST>
解决方案
创建POJO
代表您的模型,XML
然后将其序列化到XML
usingJAXB
或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("test@test.com.my");
emailList.setSubject("Transactional Submissions");
emailList.setSenderEmail("test@test.com.my");
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>test@test.com.my</Email>
<Subject>Transactional Submissions</Subject>
<SenderEmail>test@test.com.my</SenderEmail>
<EmailBody>
<body></body>
<title>This is test Title : 2019-03-18T00:03:48.168+01:00</title>
</EmailBody>
</ns2:EMAILLIST>
如果你真的需要html
和head
元素,你需要创建简单的POJO
包装器。
推荐阅读
- azure - Power BI Embedded 增量刷新
- r - 在闪亮的应用程序中根据 visNetwork 下拉节点选择更新数据表
- android - 数据绑定库 - 自动生成的类中的错误
- python - 用时间戳格式的变量替换熊猫数据帧上的年份
- office365 - Graph API office365移动邮件
- symbolic-math - 将集合转换为表达式 Maple/ 将前缀更改为 In-fix 表达式
- javascript - 使用 webpack 块时 vue 应用程序不更新
- html - 简单的 HTML 和 CSS 问题 - 文本对齐不起作用?
- spring - 版本属性工作正常但未保存在 Couchbase
- php - 将依赖项隐藏在外观后面时,正确的命名约定是什么?