Notes文書をJavaでXML文書として出力する

Notesデータベースの文書をJSON形式でやりとりできるNotesJSON****という関数があると聞いて試そうと思ったのですが……。Notes10から利用できるクラスということで、自分のNotes環境では検証できませんでした。

ただ、ヘルプなどを色々と調べているときに、generateXMLというメソッドを利用すれば、Notes文書をXML形式で出力できることが分かりました。便利そうな関数なのですが、Javaのみに用意されている関数になるため、LotusScriptは使用できません。

#generateXMLクラスの使い勝手
実際に使ってみたところ、**驚愕の機能**です。
generateXMLクラスは文書の全てのフィールド情報と値を構造的に書き出してくれるのですが、リスト形式の複数値やリッチテキストのフィールド情報まで正確に書き出してくれます。

LotusScriptで書くと、文書を取得した後、[ForAll item In doc.Items](https://qiita.com/NomuSunder/items/87d991f17cf772a16bab) などで文書内のフィールドを取得して、フィールドごとに複数値を取得するコードなど、色々と面倒なコードをチマチマと書いたりしないといけないのですが、generateXMLクラスで書くと1行で済んでしまう………。ヘルプには少しだけしか記述が割かれていませんが、もっと知られないといけない機能だと思います。

#ソースコード
```Java
import lotus.domino.*;
import java.io.*;

public class JavaAgent extends AgentBase {

    public void NotesMain() {

      try {
    	  Session session = getSession();
    	  AgentContext agentContext = session.getAgentContext();

          // (Your code goes here)
          Database db = agentContext.getCurrentDatabase();
          View view = db.getView("Main");
          view.setAutoUpdate(false);
          Document tmpdoc;
          BufferedWriter bw = new BufferedWriter( new FileWriter("c:\\temp\\document.xml"));
          Document doc = view.getFirstDocument();
          while (doc != null) {
        	  System.out.println(doc.getItemValueString("Uname"));
        	  doc.generateXML(bw);
              tmpdoc = view.getNextDocument(doc);
              doc.recycle();
              doc = tmpdoc;
          }
          bw.close();
      } catch(Exception e) {
          e.printStackTrace();
       }
   }
}
```

#実行結果
リッチテキストやリストなどの複数の種類が混在したテストフォームを作成して、複数文書がXML形式で出力されることを確認しました

##テスト用のフォームと文書
テキスト/リッチテキスト/時刻/チェックボックスなど、様々な種類のフィールドを配置したテストフォームを用意して、複数のNotes文書を作成しました。
![サンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983034/b4c1e0bc-46d0-6cb6-d76a-e307bdc543db.png)

##実行結果
```XML
<document form='Main'>
<noteinfo noteid='912' unid='C7638A880050D1014925865B001F3A1B' sequence='1'>
<created><datetime>20210112T144104,91+09</datetime></created>
<modified><datetime>20210112T144104,92+09</datetime></modified>
<revised><datetime>20210112T144104,91+09</datetime></revised>
<lastaccessed><datetime>20210112T144104,92+09</datetime></lastaccessed>
<addedtofile><datetime>20210112T144104,92+09</datetime></addedtofile></noteinfo>
<updatedby><name>CN=Taro Yamada/O=Taro Yamada</name></updatedby>
<item name='Uname'><text>山田一郎</text></item>
<item name='UDate'><datetime>20210201</datetime></item>
<item name='UTimeS'><datetime>T091500,00</datetime></item>
<item name='UTimeE'><datetime>T180000,00</datetime></item>
<item name='Rtxt'><richtext>
<pardef id='1'/>
<par def='1'><run><font size='18pt' style='bold' name='メイリオ' pitch='variable'
 truetype='true' familyid='30' color='red'/>リッチテキスト</run></par>
<par def='1'><run><font size='18pt' style='bold' name='メイリオ' pitch='variable'
 truetype='true' familyid='30' color='red'/></run></par></richtext></item>
<item name='CheckBox'><textlist><text>埼玉</text><text>東京</text><text>茨木</text></textlist></item>
<item name='Num'><number>12345678.9</number></item></document>

<document form='Main'>
<noteinfo noteid='90e' unid='4358C36AE3645EB44925865B001F2BF9' sequence='1'>
<created><datetime>20210112T144028,73+09</datetime></created>
<modified><datetime>20210112T144028,75+09</datetime></modified>
<revised><datetime>20210112T144028,74+09</datetime></revised>
<lastaccessed><datetime>20210112T144028,75+09</datetime></lastaccessed>
<addedtofile><datetime>20210112T144028,75+09</datetime></addedtofile></noteinfo>
<updatedby><name>CN=Taro Yamada/O=Taro Yamada</name></updatedby>
<item name='Uname'><text>山田三郎</text></item>
<item name='UDate'><datetime>20210112T000000,00+09</datetime></item>
<item name='UTimeS'><datetime>T090000,00</datetime></item>
<item name='UTimeE'><datetime>T180000,00</datetime></item>
<item name='Rtxt'><richtext>
<pardef id='1' keepwithnext='true' keeptogether='true'/>
<par def='1'><run><font name='メイリオ' pitch='variable' truetype='true' familyid='30'/></run></par></richtext></item>
<item name='CheckBox'><text>東京</text></item>
<item name='Num'><number>11</number></item></document>

<document form='Main'>
<noteinfo noteid='906' unid='A871F8B1625F2B0E4925865B001EFFCF' sequence='1'>
<created><datetime>20210112T143835,67+09</datetime></created>
<modified><datetime>20210112T143835,68+09</datetime></modified>
<revised><datetime>20210112T143835,67+09</datetime></revised>
<lastaccessed><datetime>20210112T143835,68+09</datetime></lastaccessed>
<addedtofile><datetime>20210112T143835,68+09</datetime></addedtofile></noteinfo>
<updatedby><name>CN=Taro Yamada/O=Taro Yamada</name></updatedby>
<item name='Uname'><text>山田二郎</text></item>
<item name='UDate'><datetime>20210103T000000,00+09</datetime></item>
<item name='UTimeS'><datetime>T090000,00</datetime></item>
<item name='UTimeE'><datetime>T180000,00</datetime></item>
<item name='Rtxt'><richtext>
<pardef id='1' keepwithnext='true' keeptogether='true'/>
<par def='1'><run><font name='メイリオ' pitch='variable' truetype='true' familyid='30'/>ああああ</run></par></richtext></item>
<item name='CheckBox'><text/></item>
<item name='Num'><text/></item></document>
```