2012-02-23 109 views
2

我有一个复杂的XML文档。我已经使用iText库从这个XML文档创建一个带标签的PDF。我已经参考了iText in Action书第15章中的例子,但它们仅限于一个简单的XML文件,其层次结构只有一层。如何从“复杂”XML文件创建带标签的PDF

如何扩展与扁平结构一起工作的算法,以便它可以处理这种层次化的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> 

回答

1

我的队友想出了一个解决这个问题。这个想法是创建一个Tree DefaultMutableTreeNode元素。每个DefaultMutableTreeNode都将包含一个PdfStructureElement。例如,树应代表XML层次结构,请考虑先前评论中的XML代码片段。第一个DefaultMutableTreeNode应该有一个PdfStructureElement(PdfName - 电影),它的父级是writer.getStructureTreeRoot()。此节点的子节点应该是另一个PdfStructureElement(PdfName - 电影),其父级是名为'movies'的PdfStrucutreElement等等。

一旦上述步骤完成(实质上是结构解析),我们得到一个PdfStrucutreElements树。现在,我们必须解析内容。在解析内容时,我们需要遍历每个树节点。如果被解析的节点是叶节点,那么我们需要在该节点内获得PdfStructureElement。否则,如果被解析的节点是非叶节点,那么我们需要获取该节点内的PdfStructureElement的PdfName。换句话说,我们可以简单地使用qName变量。

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