Java 无法使用Apache POI获取.docx文件的超链接标签

Java 无法使用Apache POI获取.docx文件的超链接标签,java,apache-poi,openxml,docx,Java,Apache Poi,Openxml,Docx,我的目标是计算docs.google.com类型的超链接在MS Word文档(.docx)中出现的次数 除了计算超链接外,我还试图计算包含“docs.google.com”的“纯文本” 例如,考虑一个具有以下文本的Word文档: https://docs.google.com/1234 根据我想要的逻辑,链接的总数应该是1+2+1=4。 第二个是2,因为显示值是一个google文档链接,而目标URL是一个google文档链接 我很难在下面的Java代码中获取“纯文本”类型链接的显示值: i

我的目标是计算docs.google.com类型的超链接在MS Word文档(.docx)中出现的次数

除了计算超链接外,我还试图计算包含“docs.google.com”的“纯文本”

例如,考虑一个具有以下文本的Word文档:

https://docs.google.com/1234

根据我想要的逻辑,链接的总数应该是1+2+1=4。 第二个是2,因为显示值是一个google文档链接,而目标URL是一个google文档链接

我很难在下面的Java代码中获取“纯文本”类型链接的显示值:

int[] getNumGDocLinksFromWord(String filepath) {

    int [] numLinks = {0, 0};
    File file = new File(filepath);

    try (FileInputStream fis = new FileInputStream(file.getAbsolutePath())) {
      XWPFDocument document = new XWPFDocument(fis);
      List<XWPFParagraph> paragraphs = document.getParagraphs();
      for (XWPFParagraph para : paragraphs) {
        numLinks[0] += numOccurrences(para.getText(), GOOG_DOC_URL_HOST);
        for(XWPFRun run : para.getRuns()) {
          if(run instanceof XWPFHyperlinkRun) {
            XWPFHyperlink link = ((XWPFHyperlinkRun)run).getHyperlink(document);
            if(link != null && link.getURL().contains(GOOG_DOC_URL_HOST)) {
              numLinks[1]++;
            }
          }
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    return numLinks;
}


private int numOccurrences(String text, String sequence) {
    int n = 0, i = 0;
    while (i != -1) {
      i = text.indexOf(sequence, i + 1);
      if (i != -1) {
        n++;
      }
    }
    return n;
}
int[]getNumGDocLinksFromWord(字符串文件路径){
int[]numLinks={0,0};
文件文件=新文件(文件路径);
try(FileInputStream fis=newfileinputstream(file.getAbsolutePath())){
XWPF文件=新的XWPF文件(fis);
列表段落=document.getPages();
对于(XWPF段落:段落){
numLinks[0]+=numOccurrences(para.getText(),GOOG_DOC_URL_HOST);
对于(XWPFRun:para.getRuns()){
if(运行XWPFHyperlinkRun的实例){
XWPFHyperlink=((XWPFHyperlinkRun)run).getHyperlink(文档);
if(link!=null&&link.getURL().contains(GOOG\u DOC\u URL\u HOST)){
numLinks[1]++;
}
}
}
}
}捕获(例外e){
e、 printStackTrace();
}
返回numLinks;
}
私有整数货币(字符串文本、字符串序列){
int n=0,i=0;
而(i!=-1){
i=text.indexOf(序列,i+1);
如果(i!=-1){
n++;
}
}
返回n;
}
numLinks[0]捕获显示值出现次数,numLinks捕获超链接的目标值出现次数


有人能告诉我如何准确地计算这两种类型的值吗?

您到底有什么问题?具有
静态字符串GOOG\u DOC\u URL\u HOST=“docs.google.com”
和您描述的word文档,您的代码为我生成了
numLinks[0]
numLinks[1]
这两个
2
,这是正确的。否?@AxelRichter,请对此文档尝试相同的操作:。numLinks应该是[3,3],但它现在是[2,3]。我添加了一些打印语句,它似乎没有拾取显示值“”。在
/word/document.xml
中有:
。。。。。。http://docs.google.com/doc...3
。正如您看到的文本
http://docs.google.com/doc
是在外部超链接中的超链接中运行的文本。文本
3
是在外部超链接中运行的文本。到目前为止,
apachepoi
没有考虑到这一点。但根据Ecma-376中的XML定义,
CT\u超链接
可能包含其他
CT\u超链接
。所以这是ApachePOI中的一个bug。