前言:厂商之间对接,虽然有标准规范约束,但是由于不同的实现方式,工单内容有着一些差异,比如,近日笔者就遇到了一个问题,需要在xml的头部,添加standalone字段。
笔者所维护的工程,产生xml工单的方式为 dom4j 工具类,截止目前看来,没有一个直接的方法可以直接给xml添加自定义的头,戳开源码,搜索version 和 encoding相关的关键字,找寻到
public void write(Document doc) throws IOException {
writeDeclaration(); // 注意看这个
if (doc.getDocType() != null) {
indent();
writeDocType(doc.getDocType());
}
for (int i = 0, size = doc.nodeCount(); i < size; i++) {
Node node = doc.node(i);
writeNode(node);
}
writePrintln();
if (autoFlush) {
flush();
}
}
protected void writeDeclaration() throws IOException {
String encoding = format.getEncoding();
// Only print of declaration is not suppressed
if (!format.isSuppressDeclaration()) {
// Assume 1.0 version
if (encoding.equals("UTF8")) {
writer.write("<?xml version=\"1.0\"");
if (!format.isOmitEncoding()) {
writer.write(" encoding=\"UTF-8\"");
}
writer.write("?>");
} else {
writer.write("<?xml version=\"1.0\"");
if (!format.isOmitEncoding()) {
writer.write(" encoding=\"" + encoding + "\"");
}
writer.write("?>");
}
if (format.isNewLineAfterDeclaration()) {
println();
}
}
}
那么,我们是否能够继承XmlWriter,重新实现自定义的write方法
package com.bytue.ma_vod.modules.macenter.util;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
/**
* @author martin
* @version 1.0
* @name: StandaloneWrite
* @date: 2020/12/3 20:09
* @description 该方法可以用来解决,写出工单,需要携带standalone头部的问题.
* @comepony 北京百途
**/
public class StandaloneWriter extends XMLWriter {
public StandaloneWriter(OutputStream out, OutputFormat format)
throws UnsupportedEncodingException
{
super(out,format);
}
protected void writeDeclaration()
throws IOException
{
OutputFormat format = getOutputFormat();
String encoding = format.getEncoding();
if(!format.isSuppressDeclaration())
{
writer.write("<?xml version=\"1.0\"");
if(encoding.equals("UTF8"))
{
if(!format.isOmitEncoding())
writer.write(" encoding=\"UTF-8\"");
} else
{
if(!format.isOmitEncoding())
writer.write(" encoding=\"" + encoding + "\"");
}
writer.write(" standalone=\"yes\"");
writer.write("?>");
if(format.isNewLineAfterDeclaration())
println();
}
}
}
当然,只要xml支持,其他的字段也可以通过类似方法处理.