我最近在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();
}
}
浙公网安备 33010602011771号