2017-05-17 71 views
0

我想給通過JAXB生成的XML文件添加一些註釋,但據我所知,這似乎不可能。我生產的文件有時會被人類手動修改,所以我希望能夠提供一些註釋以及文件中存在的一些常用的XML標籤,但註釋掉了。在JAXB輸出中添加註釋?

舉個例子,我將能夠做這樣的事情:

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

回答

1

自定義XML流寫入可以做到這一點。

例如,下面的XML流寫入將特定的標籤結束後添加評論:(這個例子使用DelegatingXMLStreamWriter的允許鏈接不同的作家: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 Stream Writer和地圖從標籤名稱傳遞給註釋。

該代碼可以很容易地擴展到在標籤開始之前或在writeStartElement方法中執行註釋輸出之後輸出註釋。