在 JAXB 输出中添加注释?

Add comments in JAXB output?

我想向通过 JAXB 生成的 XML 文件添加一些注释,但据我所知,这似乎不可能。我正在制作的文件预计偶尔会被人工修改,所以我希望能够提供一些评论以及文件中存在一些常用的 XML 标签,但被注释掉了。

举个例子,我可以这样做:

...
<!--Uncomment the below lines in order to use capability FOOBAR--!>
<!--<FOOBAR someAttribute="someValue">
    <ChildElement1/>
    <ChildElement2/>
</FOOBAR>-->
...

自定义 XML Stream Writer 可以做到这一点。

例如下面的 XML Stream Writer 将在特定标签结束后附加注释:(这个例子使用了 DelegatingXMLStreamWriter 允许链接不同的 writer:https://github.com/apache/cxf/blob/master/core/src/main/java/org/apache/cxf/staxutils/DelegatingXMLStreamWriter.java )

public class CommentingXMLStreamWriter extends DelegatingXMLStreamWriter
{
    private final Deque<String> stack = new ArrayDeque<>();
    private final Map<String, String> afterEndElementComments;

    public CommentingXMLStreamWriter(
            final XMLStreamWriter writer,
            final Map<String, String> afterEndElementComments)
    {
        super(writer);
        this.afterEndElementComments = afterEndElementComments;
    }

    @Override
    public void writeStartElement(String localName) throws XMLStreamException
    {
        super.writeStartElement(localName);
        stack.addFirst(localName);
    }

    @Override
    public void writeStartElement(String namespaceURI, String localName) throws XMLStreamException
    {
        super.writeStartElement(namespaceURI, localName);
        stack.addFirst(localName);
    }

    @Override
    public void writeStartElement(String prefix, String localName, String namespaceURI) throws XMLStreamException
    {
        super.writeStartElement(prefix, localName, namespaceURI);
        stack.addFirst(localName);
    }

    @Override
    public void writeEndElement() throws XMLStreamException
    {
        super.writeEndElement();
        final String localName = stack.pollFirst();

        if (localName == null)
            return;

        final String comment = afterEndElementComments.get(localName);

        if (comment == null)
            return;

        super.writeComment(comment);
    }
}

通过传递现有的 XML 流编写器和从标签名称到评论的映射来创建此 class 的实例。

通过在 writeStartElement 方法中进行注释输出,可以轻松扩展代码以在标记开始之前或之后输出注释。