如何使用 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
所以我有一个案例,我需要能够处理 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