基于已知XSD从数据库数据生成合规XML的Java工具有哪些?如何配置实现?
方案总览
Java生态中没有完全开箱即符合你命名的MagicXMLTool工具,但可以基于成熟的XML处理库快速封装出完全匹配你需求的工具,整体实现成本很低,且能保证生成的XML严格符合XSD规范。
核心依赖选型
推荐两种技术栈,你可以根据项目复杂度选择:
- 轻量场景:用
dom4j+ JDK内置的JAXP Schema校验模块,代码量少,灵活度高,适合XSD结构不复杂的场景 - 复杂场景:用
EclipseLink MOXy(JAXB的扩展实现),原生支持XPath节点绑定,自带XSD校验能力,适合嵌套层级深、命名空间复杂的XSD
自定义工具封装实现
你需要的调用逻辑可以通过简单的封装完全实现,以下是基于dom4j的最简示例:
import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; import javax.xml.XMLConstants; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import java.io.StringWriter; public class MagicXMLTool { private final Schema schema; private final Document document; // 初始化时加载XSD,用于后续生成XML的合规性校验 public MagicXMLTool(String xsdFilePath) throws Exception { SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); this.schema = schemaFactory.newSchema(new StreamSource(xsdFilePath)); this.document = DocumentHelper.createDocument(); // 可在此处预先创建XSD定义的根节点,避免后续set时节点不存在 } // 按XPath路径赋值,节点不存在时可自动创建层级节点(可根据需求补充创建逻辑) public void set(String xpathExpr, Object value) throws Exception { org.dom4j.XPath xpath = DocumentHelper.createXPath(xpathExpr); org.dom4j.Node targetNode = xpath.selectSingleNode(document); if (targetNode == null) { // 省略自动创建XPath对应层级节点的逻辑,可根据XPath表达式拆分路径逐步创建 return; } targetNode.setText(String.valueOf(value)); } // 生成XML字符串,自动做XSD校验,校验不通过会抛出异常 public String generateXML() throws Exception { // 先执行XSD合规校验 schema.newValidator().validate(new StreamSource(new java.io.StringReader(document.asXML()))); // 格式化输出XML StringWriter stringWriter = new StringWriter(); XMLWriter xmlWriter = new XMLWriter(stringWriter, OutputFormat.createPrettyPrint()); xmlWriter.write(document); xmlWriter.close(); return stringWriter.toString(); } }
封装完成后即可完全使用你期望的调用方式:
MagicXMLTool tool = new MagicXMLTool("mySchema.xsd"); tool.set("some/xpath/", value); tool.set("another/xpath", anotherValue); String xml = tool.generateXML();
数据库映射配置实现
你可以自定义映射配置文件,格式可以选用YAML、Properties等任意你熟悉的格式,示例配置结构如下(YAML格式):
field-mapping: - db-column: user_name xpath: /root/user/base/name default-value: "匿名用户" - db-column: user_age xpath: /root/user/base/age default-value: "0" - db-column: register_time xpath: /root/user/meta/registerTime default-value: "1970-01-01 00:00:00"
后续只需要写简单的配置读取逻辑,从数据库结果集中按db-column取字段值,为空就取default-value,再循环调用set方法传入对应的xpath和值即可,完全匹配你要的逻辑。
内容的提问来源于stack exchange,提问作者Jakub Znamenáček
相关产品推荐
相关产品推荐

