在 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 方法中进行注释输出,可以轻松扩展代码以在标记开始之前或之后输出注释。
我想向通过 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 方法中进行注释输出,可以轻松扩展代码以在标记开始之前或之后输出注释。