0

我正在尝试使用 DOCX4J 解析并将内容插入模板。作为这个模板的一部分,我有循环,我需要复制两个标记之间的所有内容,并重复所有内容 X 次。

相关代码如下:

public List<Object> getBetweenLoop(String name){
        String startTag = this.tag_start + name + "_LOOP" + this.tag_end;
        String endTag = this.tag_start + name + this.tag_end;
        P begin_loop = this.getTagParagraph(startTag);
        P end_loop = this.getTagParagraph(endTag);

        ContentAccessor parent = (ContentAccessor) this.getCommonParent(begin_loop, end_loop);

        List<Object> loop = new ArrayList<Object>();

        boolean save = false;
        //Cycle through the content for the parent and copy all the objects that
        //are between and including the start and end-tags
        for(Object item : parent.getContent()){
            if(item.equals(begin_loop) || item.equals(end_loop))
                save = (save) ? false : true;
            if(save || item.equals(end_loop)){
                loop.add(XmlUtils.deepCopy(item));
            }
            if(item.equals(end_loop)){
                //Here I want to insert everything copied X times after the current item and then exit the for loop.
                //This is the part I'm not sure how to do since I don't see any methods "Insert Child", etc.
            }
        }
        return loop;
    }

getTagParagraph 成功返回表示已发送标签的段落的对象。这很好用。

getCommonParent 返回两个提供的标签之间的共享父级。这很好用。

正如评论的那样,我的问题是如何将新复制的项目插入适当的位置。

4

2 回答 2

1

如果您要插入存储在loop集合中的所有对象,您只需执行以下操作(在您评论的条件中):

item.getContent().addAll(loop);

item表示end_loop对象(段落或其他),并将您收集的所有对象插入到loop集合中。(addAll可能也需要一个 int 参数,我不记得了,但如果需要,那只是整个MainDocumentPart.getContent()JAXB 文档表示中所需的索引)。

于 2013-06-13T13:16:16.880 回答
0

@Ben,谢谢!

如果您知道以下不起作用的任何情况,请告诉我。

实际上,我只是想出了一些非常相似的东西,但最终更改了更多代码。下面是我整理的。

   public void repeatLoop(String startTag, String endTag, Integer iterations){
        P begin_loop = this.getTagParagraph(startTag);
        P end_loop = this.getTagParagraph(endTag);
        ContentAccessor parent = (ContentAccessor) this.getCommonParent(begin_loop, end_loop);
        List<Object> content = parent.getContent();

        Integer begin_pointer = content.indexOf(begin_loop);
        Integer end_pointer = content.indexOf(end_loop);

        List<Object> loop = new ArrayList<Object>();
        for(int x=begin_pointer; x <= end_pointer; x = x + 1){
            loop.add(XmlUtils.deepCopy(content.get(x)));
        }

        Integer insert = end_pointer + 1;
        for(int z = 1; z < iterations; z = z + 1){
            content.addAll(insert, loop);
            insert = insert + loop.size();
        }
    }
于 2013-06-13T14:08:45.857 回答