2017-05-17 15 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ストリームライタとタグをタグ名からコメントに渡します。

コードを簡単に拡張して、タグの開始前にコメントを出力したり、writeStartElementメソッドでコメント出力を行ったりすることができます。

関連する問題