【开发心得】xml头部添加standalone字段 基于dom4j

前言:厂商之间对接,虽然有标准规范约束,但是由于不同的实现方式,工单内容有着一些差异,比如,近日笔者就遇到了一个问题,需要在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支持,其他的字段也可以通过类似方法处理.

猜你喜欢

转载自blog.csdn.net/qq_26834611/article/details/110684799