我最近在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书签内容的方法,结合我参考的链接使用。
/** * 开始结束节点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(); } }