我最近在https://blog.51cto.com/u_1472521/5214565的基础上实现一些读doc和docx书签内容的需求,但是该文档并没有读取docx书签内容的方法。

这读取docx书签内容找蛮久资料没找到,因为docx的文档结构是xml,以为直接用nextNode.getTextContent()方法拿到节点的数据,用该方法会报错:

org.apache.xmlbeans.impl.store.DomImpl$DomLevel3NotImplemented: DOM Level 3 Not implemented

然后一直找是不是我依赖有问题,然而并不是,因此走了很多弯路,下面贴出我的结果帮助有相同问题的网友。

下面代码中getDocxBookmarkText就是获取docx书签内容的方法,结合我参考的链接使用。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
 *  开始结束节点name:  w:bookmarkStart  w:bookmarkEnd
 * @param bookmark
 * @return
 */
private String getDocxBookmarkText(CTBookmark bookmark){
    Node nextNode = bookmark.getDomNode();
     
    StringBuilder text = new StringBuilder();
    do{
        String nodeName = nextNode.getNodeName();
        if(!StringUtils.equals(nodeName,"w:bookmarkStart")){
            text.append(getNoteText(nextNode));
        }
        nextNode = nextNode.getNextSibling();
    }
    while (nextNode != null
            && !StringUtils.equals(nextNode.getNodeName(),"w:bookmarkEnd"));
    return text.toString();
}
 
private String getNoteText(Node node){
    String nodeName = node.getNodeName();
    if(StringUtils.equals(nodeName,"#text")){//说明是text节点
        return node.getNodeValue();
    }else{//递归的去看子节点
        StringBuilder text = new StringBuilder();
        NodeList childNodes = node.getChildNodes();
        if(childNodes != null){
            for (int i = 0; i < childNodes.getLength(); i++) {
                Node item = childNodes.item(i);
                text.append(getNoteText(item));
            }
        }
        return text.toString();
    }
}