如何使用 docx4j 获取主文档部分中的实际超链接元素

How to get the actual Hyperlink element inside the main document part using docx4j

所以我有一个案例,我需要能够处理 docx 正文中的实际 Hyperlink 元素,而不仅仅是目标 URL 或 internal/externality 的 link.

作为一个可能的额外问题,这个 hyperlink 在打开时并没有出现在 docx 中,而是由 docx4j-xhtmlImporter 添加的。

我在这里重复了关系列表:wordMLPackage.getMainDocumentPart().getRelationshipsPart().getRelationships().getRelationship()

并找到了我想要的 hyperlink 的关系 ID。我正在尝试使用 XPath 查询:List<Object> results = wordMLPackage.getMainDocumentPart().getJAXBNodesViaXPath("//w:hyperlink[@r:id='rId11']", false); 但是列表是空的。我还认为它可能需要刷新,因为我在运行时添加了 hyperlink,所以我尝试将 refreshXMLFirst 参数设置为 true。万一它不是真正的节点,因为它是 P 的内部 class,我也尝试使用与上面相同的参数 getJAXBAssociationsForXPath,但没有 return 任何东西。

此外,即使像 "//w:hyperlink" 这样的 XPath 也无法匹配任何内容。

如果我在保存到文件后解压缩它,我可以在 XML 中看到 hyperlinks,所以我知道 ID 是正确的:<w:hyperlink r:id="rId11">

XPath 是找到这个的正确方法吗?如果是,我做错了什么?如果不是,我应该做什么?

谢谢

尝试不绑定命名空间

List<Object> results = wordMLPackage.getMainDocumentPart().getJAXBNodesViaXPath("//*:hyperlink[@*:id='rId11']", false);

XPathHyperlinkTest.java 是一个对我有用的简单测试用例

您遇到问题的原因可能是 JAXB,或者可能是因为在您的案例中设置活页夹的具体方式(您是先打开现有的 docx,还是创建一个新的?)。您使用的是哪个 docx4j 版本?

您使用的是哪种 JAXB 实现?如果它是 Sun/Oracle 实现(参考实现,或包含在他们的 JDK/JRE 中的实现),则可能是导致问题的原因,在这种情况下,您可以尝试改用 MOXy。

使用 XPath 的替代方法是遍历 docx;见 finders/ClassFinder.java