COBOL XML PARSEは、位置情報(AFAIK)を提供しません。特定のイベントが発生するオフセット位置を特定することはできません。関心のあるタグのテキスト検索は、問題の山につながるはずです-そこに行くことさえ考えないでください...
私が考えることができる次の可能性は、元のドキュメントの解析中に対象のXMLフラグメントドキュメントを作成することです。フラグメントが完成したら、XMLデータベースに書き込みます。
以下のサンプルプログラムは、それを実行する方法を示しています。このプログラムは、XML-SOURCEドキュメントを取得し、それを解析して、interstのイベント(「b」タグなど)を探します。このようなタグが見つかると、終了タグが見つかるまでフラグメントドキュメント(XML-FRAGMENT)の作成を開始します。この時点でフラグメントが出力され、次のフラグメントの検索が開始されます。
IDENTIFICATION DIVISION.
PROGRAM-ID. XMLTEST.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 XL PIC S9(4) BINARY.
01. PIC X.
88 XML-EXTRACT-NO VALUE 'N'.
88 XML-EXTRACT-YES VALUE 'Y'.
01.
05 XML-FRAGMENT PIC X(8000).
05 XML-CHARS PIC S9(4) BINARY.
01 XML-SOURCE PIC X(8000).
PROCEDURE DIVISION.
MAINLINE SECTION.
MOVE '<a><b><c>Content</c><c>More content</c></b></a>'
TO XML-SOURCE
SET XML-EXTRACT-NO TO TRUE
XML PARSE XML-SOURCE
PROCESSING PROCEDURE XTRACT
GOBACK
.
XTRACT SECTION.
COMPUTE XL = FUNCTION LENGTH (XML-TEXT)
EVALUATE XML-EVENT
WHEN 'START-OF-ELEMENT'
*
* New XML element: Ignore it, add to existing fragment
* or start a new fragment...
*
IF XML-TEXT(1:XL) = 'b' OR XML-EXTRACT-YES
IF XML-EXTRACT-NO
MOVE ZERO TO XML-CHARS
SET XML-EXTRACT-YES TO TRUE
END-IF
STRING '<' XML-TEXT(1:XL) '>' DELIMITED BY SIZE
INTO XML-FRAGMENT(XML-CHARS + 1 : XL + 2)
COMPUTE XML-CHARS = XML-CHARS + XL + 2
END-IF
WHEN 'END-OF-ELEMENT'
*
* End of event: Add to XML fragment, ignore fragment or
* output complete fragment and start search
* for a new one...
*
IF XML-EXTRACT-YES
STRING '</' XML-TEXT(1:XL) '>' DELIMITED BY SIZE
INTO XML-FRAGMENT(XML-CHARS + 1 : XL + 3)
COMPUTE XML-CHARS = XML-CHARS + XL + 3
END-IF
IF XML-TEXT(1:XL) = 'b'
*
* End of fragment write to database (or whatever)
*
DISPLAY XML-FRAGMENT(1:XML-CHARS)
SET XML-EXTRACT-NO TO TRUE
END-IF
WHEN 'CONTENT-CHARACTERS'
*
* Add event data to fragment or just ignore it...
*
* Depening on the structure of your XML docuemnt you may
* need to react to addtional EVENTS such as CDATA to ensure
* proper tag construction.
*
IF XML-EXTRACT-YES
MOVE XML-TEXT(1:XL) TO XML-FRAGMENT(XML-CHARS + 1 : XL)
COMPUTE XML-CHARS = XML-CHARS + XL
END-IF
END-EVALUATE
.
このプログラム例からの出力は次のとおりです。
<b><c>Content</c><c>More content</c></b>
これはあなたが探していたかもしれない一行の解決策ではありませんが、これがCOBOLであることを覚えておく必要があります!