3

複雑な XML ドキュメントがあります。iText ライブラリを使用して、この XML ドキュメントからタグ付き PDF を作成しました。iText in Action book の第 15 章の例を参照しましたが、それらは 1 レベルの深さの階層を持つ単純な XML ファイルに限定されています。

以下の例のように、フラット構造で動作するアルゴリズムを拡張して、そのような階層的な XML を処理できるようにするにはどうすればよいですか?

サンプルの「複雑な」XML ドキュメント:

<?xml version="1.0" encoding="UTF-8" ?>
   <movies>
      <movie duration="141" imdb="0062622" year="1968">
          <title>2001: A Space Odyssey</title>
          <directors>
              <director>Kubrick, Stanley</director>
          </directors>
          <countries>
              <country>United Kingdom</country>
              <country>United States</country>
          </countries>
       </movie>
    </movies>
4

1 に答える 1

1

私のチームメイトは、この問題の解決策を思いつきました。アイデアは、DefaultMutableTreeNode 要素のツリーを作成することです。各 DefaultMutableTreeNode には PdfStructureElement が含まれます。ツリーは XML 階層を表す必要があります。たとえば、前のコメントの XML コード スニペットを考えてみましょう。最初の DefaultMutableTreeNode には、親が writer.getStructureTreeRoot() である PdfStructureElement(PdfName - movies) が必要です。このノードの子は別の PdfStructureElement(PdfName - movie) である必要があり、その親は「movies」という名前の PdfStructureElement などです。

上記の手順 (基本的には構造解析) が完了すると、PdfStrucutreElements のツリーが得られます。次に、コンテンツを解析する必要があります。コンテンツを解析するときは、各ツリー ノードをトラバースする必要があります。解析されるノードがリーフ ノードである場合、そのノード内の PdfStructureElement を取得する必要があります。それ以外の場合、解析されるノードが非リーフ ノードである場合は、そのノード内の PdfStructureElement の PdfName を取得する必要があります。つまり、単純に qName 変数を使用できます。

if(node is a leaf) 
     PdfStructureElement element=(PdfStructureElement)node.getUserObject();
     canvas.beginMarkedContentSequence(element); 
else 
     canvas.beginMarkedContentSequence(qName);

于 2012-02-24T04:00:39.363 に答える